typeof generic and casted type
假设我们有通用方法:
1 2 3 4 5
| public void GenericMethod <T >(T item )
{
var typeOf = typeof(T );
var getType = item .GetType();
} |
我们用以下参数调用它:
1 2
| GenericMethod(1)
GenericMethod((object) 1) |
结果是:
1 2
| typeOf = System.Int32
getType = System.Int32 |
和
1 2
| typeOf = System.Object
getType = System.Int32 |
有人能解释一下为什么类型化为object的integer返回System.Object,而.getType()返回System.Int32吗?
- 在typeof takestype name(specify which你在编译时)运行,得到GetTypethe of an instance型。
- 也,如果你发现自己在做任何kind of Generic型试验在问自己,是否你的工作选择正确的工具的工作。因为它意味着你不可能在运行时工作properly"答应"的东西,你在编译时(你可以说你可以做任何工作模式的换型,受约束的任何参数,Generic型在线型)
typeof返回泛型参数T的静态(编译时)类型。
GetType返回变量item中包含的值的动态(运行时)类型。
如果您将方法设置为非泛型,则很容易看到不同之处。假设B是A的一个子类型:
1 2 3 4 5
| public void NonGenericMethod (A item )
{
var typeOf = typeof(A );
var getType = item .GetType();
} |
在这种情况下,打电话给NonGenericMethod(new B())将产生
建议进一步阅读:
现在,您可能会问:为什么在示例中使用NonGenericMethod(A item)而不是NonGenericMethod(B item)?这是个很好的问题!考虑以下(非通用)示例代码:
1 2 3 4 5 6 7 8 9 10 11 12
| 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),你会得到什么?
为什么?因为重载解析是在编译时完成的,而不是在运行时。在编译时,表达式(A) new B()的类型是A,就像(object) 1的编译时类型是object一样。
建议进一步阅读:
- 虽然typeOf将在第一次使用特定的T执行函数之前得到解决,但它可能在程序开始执行之后发生。与C++不同,C语言使程序能够根据输入创建无限数量的不同类型,即使不使用反射。在这种情况下,可能无法生成可调用函数的每种类型的T的列表,因此无法确定在程序执行之前T是什么。
在GenericMethod((object) 1)中,T将是object。类型反映了这一点。
但item.GetType();是一个虚拟方法,将在运行时在int32上执行。
对gettype的调用在运行时得到解析,而typeof在编译时得到解析。这就是它产生不同结果的原因。您可以检查这里-何时何地使用getType()或typeof()?
在排除类型干扰时,可以清楚地看到:
GenericMethod(1)实际上是GenericMethod(1)。
GenericMethod((object) 1)推断为GenericMethod。
当您询问typeof(T)时,它返回您在方法调用中指定的T。你也可以做GenericMethod,它会把object返回到typeof(T)上。
GetType返回所提供实例的实际运行时类型。
这告诉我typeof为您提供编译时类型,而gettype为您提供确切的运行时类型。