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

时间:2014-11-25 14:14:05

标签: c#

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

请考虑以下事项:

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,而另一方面,如果转换不成功,显式转换会抛出异常,但编译器为什么要关心这个?在这种情况下,我认为它们没有区别。

提前谢谢!

1 个答案:

答案 0 :(得分:5)

不同之处在于,如果编译器知道一个,通常一个演员可以执行用户定义的转换。对于泛型类型,编译器没有该信息。如果您只想执行直接参考转换投射,您可以先投射到object

FuncRequireB((B)(object) t);

对于我来说,可用转换的这一方面从来都不是非常,但实际上 - 但确实有效。

请注意,如果您可以将T限制为与B类型兼容,那就更清晰了。如果它的位只适用于特定类型的参数,那么你的类型并不是非常通用的。