Являются ли typeof (T) и this.GetType (). GetGenericArguments () [0] всегда эквивалентными в экземпляре класса generi c? - PullRequest
1 голос
/ 17 марта 2020

У меня есть ковариантно-безопасный обобщенный класс c, который оборачивает другой. Я хочу sh, чтобы упростить получение наиболее производного типа, доступного для экземпляра во время выполнения:

public interface IReference<out T> { Type UnderlyingType { get; } }

public class Reference<T> : IReference<T> where T : class
{
    public Type UnderlyingType => /*typeof(T)*/ this.GetType().GetGenericArguments()[0];
}

Я вполне уверен, что в приведенном выше примере я могу просто использовать typeof(T) чтобы ускорить реализацию, описанную выше, - но я хочу убедиться, что это не приведет к случаям, когда возвращается тип времени компиляции, отличный от типа времени выполнения.


Например, если кто-то идет:

IReference<object> weak = new Reference<string>()
IdentifyReference(weak);

void IdentifyReference<T>(IReference<T> unknown) where T : class {
    Print(typeof(T));
    Print(unknown.UnderlyingType);
}

Я хочу следующий вывод:

object
string

1 Ответ

1 голос
/ 17 марта 2020

Вы можете быть уверены, что typeof(T) в свойстве UnderlyingType создает тип времени выполнения из-за того, как работает полиморфизм.

Во время компиляции просто недостаточно информации для компилятора, чтобы выяснить, что unknown.UnderlyingType есть. Имейте в виду, что IReference - это интерфейс, поэтому компилятор не имеет ни малейшего представления о том, что такое конкретный тип unknown. Следовательно, он даже не знает, что эта конкретная реализация должна быть выполнена:

public Type UnderlyingType => typeof(T) /*this.GetType().GetGenericArguments()[0]*/;

Что касается компилятора, это может быть реализация из Foo, которая просто реализует IReference<object>.

Следовательно, выражение typeof(T) вычисляется во время выполнения, когда происходит полиморфизм времени выполнения (динамическая c диспетчеризация выбирает правильную реализацию). В результате работы полиморфизма выражение всегда оценивается в контексте типа времени выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...