Вы можете быть уверены, что typeof(T)
в свойстве UnderlyingType
создает тип времени выполнения из-за того, как работает полиморфизм.
Во время компиляции просто недостаточно информации для компилятора, чтобы выяснить, что unknown.UnderlyingType
есть. Имейте в виду, что IReference
- это интерфейс, поэтому компилятор не имеет ни малейшего представления о том, что такое конкретный тип unknown
. Следовательно, он даже не знает, что эта конкретная реализация должна быть выполнена:
public Type UnderlyingType => typeof(T) /*this.GetType().GetGenericArguments()[0]*/;
Что касается компилятора, это может быть реализация из Foo
, которая просто реализует IReference<object>
.
Следовательно, выражение typeof(T)
вычисляется во время выполнения, когда происходит полиморфизм времени выполнения (динамическая c диспетчеризация выбирает правильную реализацию). В результате работы полиморфизма выражение всегда оценивается в контексте типа времени выполнения.