Почему свойство, унаследованное от интерфейса, становится виртуальным?

Скажем, у меня есть один интерфейс и два класса, и один из классов реализует этот интерфейс:

interface IAAA
{
    int F1 { get; set; }
}

class AAA1
{
    public int F1 { get; set; }
    public int F2 { get; set; }
}

class AAA2 : IAAA
{
    public int F1 { get; set; }
    public int F2 { get; set; }
}

В классе AAA2 свойство F1 "унаследовано" (я не уверен) от интерфейса IAAA, затем я использую отражение, чтобы проверить, является ли свойство виртуальным:

Console.WriteLine("AAA1 which does not implement IAAA");
foreach (var prop in typeof(AAA1).GetProperties())
{
    var virtualOrNot = prop.GetGetMethod().IsVirtual ? "" : " not";
    Console.WriteLine([email protected]"{prop.Name} is{virtualOrNot} virtual");
}

Console.WriteLine("AAA2 which implements IAAA");
foreach (var prop in typeof(AAA2).GetProperties())
{
    var virtualOrNot = prop.GetGetMethod().IsVirtual ? "" : " not";
    Console.WriteLine($"{prop.Name} is{virtualOrNot} virtual");
}

Выход:

AAA1 which does not implement IAAA
F1 is not virtual
F2 is not virtual
AAA2 which implements IAAA
F1 is virtual
F2 is not virtual

Есть причина для этого?

Ответ 1

Как в разделе замечаний по документации MS:

Виртуальный член может ссылаться на данные экземпляра в классе, и на него следует ссылаться через экземпляр класса... В среде общего языка требуется, чтобы все методы, реализующие элементы интерфейса, были помечены как виртуальные; поэтому компилятор помечает метод virtual final

Если вам необходимо определить, можно ли переопределить этот метод, тогда проверки IsVirtual недостаточно, и вам также необходимо проверить, что IsFinal имеет значение false.

Вот метод расширения, который делает эту проверку:

public static bool IsOverridable(this MethodInfo method)
    => method.IsVirtual && !method.IsFinal;