假设我们有通用方法:
public void GenericMethod<T>(T item)
{
var typeOf = typeof(T);
var getType = item.GetType();
}
我们使用以下参数调用它:
GenericMethod(1)
GenericMethod((object) 1)
结果是:
typeOf = System.Int32
getType = System.Int32
和
typeOf = System.Object
getType = System.Int32
有人能解释一下为什么转换为对象的整数类型返回 System.Object,而 .GetType() 返回 System.Int32 吗?
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
.
推荐进一步阅读: