所以,我遇到了以下问题"我真的好奇它背后的原因。
请考虑以下事项:
public class B
{
}
public class A<T>
{
private void AFunc(T t)
{
FuncRequireB((B)t); // Not allowed
FuncRequireB(t as B); // Allowed
}
private void FuncRequireB(B b)
{
}
}
我知道优雅的解决方案是在课堂上将T定义为B,但我想知道为什么&#34;(B)t&#34;并且&#34; t为B&#34;在这种情况下不同。我知道&#34; as&#34;是安全的,所以如果无法完成转换,它只能生成null,而另一方面,如果转换不成功,显式转换会抛出异常,但编译器为什么要关心这个?在这种情况下,我认为它们没有区别。
提前谢谢!
答案 0 :(得分:5)
不同之处在于,如果编译器知道一个,通常一个演员可以执行用户定义的转换。对于泛型类型,编译器没有该信息。如果您只想执行直接参考转换投射,您可以先投射到object
:
FuncRequireB((B)(object) t);
对于我来说,可用转换的这一方面从来都不是非常,但实际上 - 但确实有效。
请注意,如果您可以将T
限制为与B
类型兼容,那就更清晰了。如果它的位只适用于特定类型的参数,那么你的类型并不是非常通用的。