所以,我遇到了以下"问题",我真的很好奇它背后的原因.
考虑以下:
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)
{
}
}
Run Code Online (Sandbox Code Playgroud)
我知道优雅的解决方案是在课堂上将T定义为B,但我想知道为什么在这种情况下"(B)t"和"t as B"不同.我知道"as"是安全的,所以如果无法进行转换,它只能生成null,而另一方面,如果转换不成功,则显式转换会抛出异常,但编译器为什么要关心这个?在这种情况下,我认为他们之间没有区别.
先感谢您!
不同之处在于,如果编译器知道一个转换,通常转换可以执行用户定义的转换.对于泛型类型,编译器没有该信息.如果您只想执行直接引用转换转换,您可以转换为object第一个:
FuncRequireB((B)(object) t);
Run Code Online (Sandbox Code Playgroud)
对于我来说,可用转换的这一方面从来都不是很清楚 - 说实话 - 但确实有效.
请注意,如果您可以约束T与类型兼容B,那将更清晰.如果它的位只适用于特定类型的参数,那么它的类型不是很通用.
| 归档时间: |
|
| 查看次数: |
137 次 |
| 最近记录: |