显式强制转换运算符与 T 一样

本文关键字:一样 运算符 转换 | 更新日期: 2023-09-27 18:31:49

所以,我遇到了以下"问题",我真的很好奇它背后的原因。

请考虑以下事项:

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,但我想知道为什么在这种情况下"(B)t"和"t as B"不同。我知道"as"是安全的,所以如果无法完成转换,它可以生成 null,另一方面,如果转换不成功,显式强制转换会引发异常,但为什么编译器应该关心这个?在这种情况下,我认为它们之间没有区别。

提前谢谢你!

显式强制转换运算符与 T 一样

不同之处在于,如果编译器知道用户定义的转换,则通常强制转换可以执行用户定义的转换。对于泛型类型,编译器没有该信息。如果只想执行直接引用转换转换,可以先强制转换为object

FuncRequireB((B)(object) t);

老实说,可用转换的这一方面对我来说从来都不是很清楚 - 但它确实有效。

请注意,如果您无论如何都可以将T限制为与B类型兼容,那会更干净。如果类型中的位仅适用于特定类型参数,则您的类型不是很通用。