Ответ 1
typeof
возвращает статический (во время компиляции) тип универсального параметра T
GetType
возвращает динамический (во время выполнения) тип значения, содержащегося в item
переменной.
Разницу легче увидеть, если вы сделаете свой метод неуниверсальным. Предположим, что B
является подтипом A
:
public void NonGenericMethod(A item)
{
var typeOf = typeof(A);
var getType = item.GetType();
}
В этом случае вызов NonGenericMethod(new B())
даст
A
B
Рекомендуется для дальнейшего чтения:
Теперь вы можете спросить: почему вы использовали NonGenericMethod(A item)
в вашем примере вместо NonGenericMethod(B item)
? Это очень хороший вопрос! Рассмотрим следующий (не универсальный) пример кода:
public static void NonGenericMethod(A item)
{
Console.WriteLine("Method A");
var typeOf = typeof(A);
var getType = item.GetType();
}
public static void NonGenericMethod(B item)
{
Console.WriteLine("Method B");
var typeOf = typeof(B);
var getType = item.GetType();
}
Что вы получаете, когда вызываете NonGenericMethod((A) new B())
(что аналогично аргументу (object) 1
в вашем примере)?
Method A
A
B
Зачем? Потому что разрешение перегрузки выполняется во время компиляции, а не во время выполнения. Во время компиляции тип выражения (A) new B()
- это A
, точно так же, как тип времени (object) 1
время компиляции - это object
.
Рекомендуется для дальнейшего чтения: