我见过这段代码:
StringBuilder Foo<T> (T arg)
{
if (arg is StringBuilder)
return (StringBuilder) arg; // Will not compile
...
}
但是:
StringBuilder Foo<T> (T arg)
{
StringBuilder sb = arg as StringBuilder;
if (sb != null) return sb;
...
}
将编译。
为什么?编译器害怕什么?
P.S。我见过另一个解决方案:
(StringBuilder) (object) arg
答案 0 :(得分:5)
我认为,因为T
和StringBuilder
类型之间没有保证转换。
将其指定为arg as StringBuilder
,如果转换失败,它将返回null
和不异常,就像在前一种情况下一样。 Null
是一个有效的案例,在此函数中,就像返回类型一样。
答案 1 :(得分:1)
编译器必须知道强制转换才能在编译时工作。实际上,您可以在自己的类上实现显式转换运算符。但是,转换(as
)包括运行时检查,如果转换失败,则返回null。
由于编译器对T
一无所知,因此无法编译。 if
并没有改变这一事实,因为它只是确保它在运行时才能运行。但编译器不会分析运行时行为。