typeof generic和casted类型

use*_*929 22 c# generics

假设我们有通用方法:

public void GenericMethod<T>(T item)
{
    var typeOf = typeof(T);
    var getType = item.GetType();
}
Run Code Online (Sandbox Code Playgroud)

我们使用以下参数调用它:

GenericMethod(1)
GenericMethod((object) 1)
Run Code Online (Sandbox Code Playgroud)

结果是:

typeOf = System.Int32
getType = System.Int32
Run Code Online (Sandbox Code Playgroud)

typeOf = System.Object
getType = System.Int32
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么输入到对象的typeof整数返回System.Object,但.GetType()返回System.Int32?

Hei*_*nzi 30

typeof返回泛型参数的静态(编译时)类型T.

GetType返回变量中包含的动态(运行时)类型.item


如果您使方法非通用,则更容易看出差异.我们假设这B是一个子类型A:

public void NonGenericMethod(A item)
{
    var typeOf = typeof(A);
    var getType = item.GetType();
}
Run Code Online (Sandbox Code Playgroud)

在那种情况下,调用NonGenericMethod(new B())会产生

A
B
Run Code Online (Sandbox Code Playgroud)

建议进一步阅读:


现在,您可能会问:为什么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();
}
Run Code Online (Sandbox Code Playgroud)

你打电话时得到了什么NonGenericMethod((A) new B())(这与(object) 1你的例子中的论点类似)?

Method A
A
B
Run Code Online (Sandbox Code Playgroud)

为什么?因为重载解析是在编译时完成的,而不是在运行时完成的.在编译时,表达的类型(A) new B()A,就像的编译时间类型(object) 1object.

建议进一步阅读: