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