为什么我不能将int转换为T,但是可以将int转换为object然后对象转换为T?
此代码无法编译:
public T Get() { T result = default(T); if(typeof(T) == typeof(int)) { int i = 0; result = (T)i; } return result; }
但是,这段代码确实编译:
public T Get() { T result = default(T); if(typeof(T) == typeof(int)) { int i = 0; result = (T)(object)i; } return result; }
代码也可以正常工作。 我不明白为什么编译器可以将对象(实际类型可以是任何东西)强制转换为T,但是不能将int(从对象中转移)转换为T.
正如SLaks所说,编译器知道T可以转换为对象,但这只是它的一半。 编译器还知道类型T的任何对象都是从对象派生的,因此它需要允许从对象到T的向下转换。前面的集合v2.0需要这个。 当然不是T,但能够从对象转向任何类型。 除了对象之外,从集合中获取任何东西是不可能的。
在谈论T和int时,情况并非如此。 由于if语句,编译器无法看到代码,因此在运行时代码是安全的。 一般情况下(虽然不是在这种情况下)certificate你永远不会得到一个if的主体在一些外部条件为真的情况下是NP完全的 ,因为我们希望编译在某些时候完成,所以它不会尝试并基本解决千禧奖问题
在许多情况下,在非通用代码中不允许将特定类型替换为T. 如果您不能将代码编写为非generics代码以替换具有特定类型的T,则它无效,不仅仅是在这种情况下,而是一般情况下。 如果您知道该方法的所有用例实际上都是有效的,则可以对通用方法使用约束
编译器不知道T
是int
。 (即使你刚刚certificate它在你的if
是int
)
相比之下,编译器确实知道T
总是可以转换为object
。
例如,如果T
是string
,它仍然可以转换为object
,但它不能转换为int
。