c# - C# 类型和类型转换类型

  显示原文与译文双语对照的内容
125 2

假设我们有泛型方法:

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

有人能解释为什么整型强制转换为对象,但. GetType() 返回 System.Int32?

时间:原作者:0个回答

98 1

typeof 返回泛型参数 Tstatic ( 编译时间) 类型。

GetType 返回变量 item 包含的英镑值的英镑动态( 运行时间) 类型。

如果你的方法不通用,那么区别就更容易了。假设 BA的子类型:

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,就像 (object) 1的编译时间类型是 object

推荐进一步阅读:

原作者:
...