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

Sze*_*szi 2 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)
    {

    }
}
Run Code Online (Sandbox Code Playgroud)

我知道优雅的解决方案是在课堂上将T定义为B,但我想知道为什么在这种情况下"(B)t"和"t as B"不同.我知道"as"是安全的,所以如果无法进行转换,它只能生成null,而另一方面,如果转换不成功,则显式转换会抛出异常,但编译器为什么要关心这个?在这种情况下,我认为他们之间没有区别.

先感谢您!

Jon*_*eet 5

不同之处在于,如果编译器知道一个转换,通常转换可以执行用户定义的转换.对于泛型类型,编译器没有该信息.如果您只想执行直接引用转换转换,您可以转换为object第一个:

FuncRequireB((B)(object) t);
Run Code Online (Sandbox Code Playgroud)

对于我来说,可用转换的这一方面从来都不是清楚 - 说实话 - 但确实有效.

请注意,如果您可以约束T与类型兼容B,那将更清晰.如果它的位只适用于特定类型的参数,那么它的类型不是很通用.