Следующий вызов в С# возвращает false:
typeof(IComparable).IsAssignableFrom(typeof(DateTime?))
Тем не менее, следующая строка совершенно верна:
IComparable comparable = (DateTime?)DateTime.Now;
Почему так?
Это потому, что типы с нулевым значением поддерживаются с помощью Nullable<T>
и тот факт, что первый общий аргумент реализует интерфейс, не означает, что класс Nullable также реализует этот интерфейс? (например: List<Foo>
не реализует интерфейсы, реализуемые Foo
)
ИЗМЕНИТЬ: Я думаю, что строка выше компилируется, потому что при боксе с нулевым типом вставляется только базовый тип, как описано здесь: https://msdn.microsoft.com/en-us/library/ms228597.aspx