C#编译器在引用转换时害怕转换?

时间:2012-03-07 08:35:56

标签: c# generics .net-4.0

我见过这段代码:

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

2 个答案:

答案 0 :(得分:5)

我认为,因为TStringBuilder类型之间没有保证转换。 将其指定为arg as StringBuilder,如果转换失败,它将返回null异常,就像在前一种情况下一样。 Null是一个有效的案例,在此函数中,就像返回类型一样。

答案 1 :(得分:1)

编译器必须知道强制转换才能在编译时工作。实际上,您可以在自己的类上实现显式转换运算符。但是,转换(as)包括运行时检查,如果转换失败,则返回null。

由于编译器对T一无所知,因此无法编译。 if并没有改变这一事实,因为它只是确保它在运行时才能运行。但编译器不会分析运行时行为。