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

Roy*_*mir 0 c# generics .net-4.0

我见过这段代码:

StringBuilder Foo<T> (T arg)
{
 if (arg is StringBuilder)
 return (StringBuilder) arg; // Will not compile
 ...
}
Run Code Online (Sandbox Code Playgroud)

但是:

StringBuilder Foo<T> (T arg)
{
 StringBuilder sb = arg as StringBuilder;
 if (sb != null) return sb;
 ...
}
Run Code Online (Sandbox Code Playgroud)

编译.

这是为什么 ?编译器害怕什么?

ps我见过另一个解决方案:

(StringBuilder) (object) arg
Run Code Online (Sandbox Code Playgroud)

Tig*_*ran 5

我认为,因为类型T和类型之间没有保证转换StringBuilder.指定它arg as StringBuilder,如果转换失败,它将返回a null不是异常,就像在previouse情况下一样.Null是一个有效的案例,在这个函数中,就像一个返回类型.