Почему свойство помечается как виртуальное при реализации интерфейса?

Глядя на отраженное PropertyInfo класса, я обнаружил, что свойства помечаются как виртуальные, когда они реализуют интерфейс, который объявляет это свойство.

class Program
{
    public interface IWhatever
    {
        long? Id { get; set; }
    }

    public class Whatever : IWhatever
    {
        public long? Id { get; set; }
    }

    static void Main(string[] args)
    {
        var properties = typeof(Whatever)
            .GetProperties()
            .Where(_ => _.GetMethod?.IsPublic ?? false)
            .Where(_ => !_.GetMethod.IsVirtual)
            .Where(_ => _.SetMethod?.IsPublic ?? false)
            .Where(_ => !_.SetMethod.IsVirtual)
            .Select(_ => _.Name)
            .ToArray();

        Console.WriteLine(string.Join(", ", properties));
    }
}

Если я запускаю этот код, свойства не сообщаются, потому что Id Get/Set помечены IsVirtual. Если я удаляю интерфейс, Id возвращается, потому что IsVirtual имеет значение false. Хотя это должно быть языковой особенностью, мне интересно, почему?

Было бы неплохо иметь возможность определить, было ли свойство специально объявлено как виртуальное, вместо того, чтобы просто быть виртуальным по природе использования одного или нескольких интерфейсов. В чем причина такого поведения?

0 ответов

Другие вопросы по тегам