此代码无法编译:
public T Get<T>()
{
T result = default(T);
if(typeof(T) == typeof(int))
{
int i = 0;
result = (T)i;
}
return result;
}
然而,这段代码确实编译:
public T Get<T>()
{
T result = default(T);
if(typeof(T) == typeof(int))
{
int i = 0;
result = (T)(object)i;
}
return result;
}
代码也可以正常工作。我不明白为什么编译器可以将一个对象(实际类型可以是任何东西)强制转换为T,但是不能将int(从对象中转换为对象)转换为T.
答案 0 :(得分:9)
正如SLaks所说,编译器知道T
可以转换为对象,但这只是它的一半。编译器还知道T
类型的任何对象都来自object
,因此它需要允许从object
向T
转发。T
。 pre v2.0之前的集合需要这个。当然不是T
,而是能够从对象转向任何类型。除了对象之外,从集合中获取任何东西是不可能的。
在谈论int
和T
时,情况并非如此。由于if语句,您的代码当然在运行时不会遇到这些问题,但编译器无法看到。一般情况下(虽然不是在这种情况下)证明在某些外部条件为真的情况下你永远不会得到if的主体是NP-complete并且因为我们希望编译器在某些时候完成,所以它不是试着基本上解决millennium prize problem
在许多情况下,在非通用代码中不允许替换T
的特定类型。
如果您不能将{{1}}替换为特定类型的非泛型代码,则它无效,不仅仅是在这种情况下,而是一般情况下。如果您知道该方法的所有用例实际上都是有效的,则可以使用constraints进行通用方法。
答案 1 :(得分:6)
编译器不知道T
是int
。 (即使您刚刚证明int
中的if
}
相比之下,编译器确实知道T
始终可以转换为object
。
例如,如果T
是string
,它仍然可以转换为object
,但它不能转换为int
。