C#编译器害怕引用转换时进行强制转换?

C#编译器害怕引用转换时进行强制转换?,c#,generics,.net-4.0,C#,Generics,.net 4.0,我看过这个代码: StringBuilder Foo<T> (T arg) { if (arg is StringBuilder) return (StringBuilder) arg; // Will not compile ... } 我认为,因为在类型T和StringBuilder之间没有保证的转换。 将其像arg那样指定为StringBuilder,如果转换失败,它将返回一个null,而不是异常,就像前面的情况一样Null是一个有效的情况,在这个函数中,就像返回类型一

我看过这个代码:

StringBuilder Foo<T> (T arg)
{
 if (arg is StringBuilder)
 return (StringBuilder) arg; // Will not compile
 ...
}

我认为,因为在类型
T
StringBuilder
之间没有保证的转换。
将其像
arg那样指定为StringBuilder
,如果转换失败,它将返回一个
null
,而不是异常,就像前面的情况一样
Null
是一个有效的情况,在这个函数中,就像返回类型一样。

我认为,因为类型
T
StringBuilder
之间没有保证的转换。
将其像
arg那样指定为StringBuilder
,如果转换失败,它将返回一个
null
,而不是异常,就像前面的情况一样
Null在这个函数中是有效的,就像返回类型一样。

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


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

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


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

通常
(t)(对象)
足够快。我通常会用它。@leppie这是怎么回答我的问题的?:)您返回的特定类型仍然可能无法通过强制转换返回。该代码有什么用途?我认为泛型是为了避免铸件…@vulkanino引用转换。此代码来自一本书。
(T)(对象)
通常足够快。我通常会用它。@leppie这是怎么回答我的问题的?:)您返回的特定类型仍然可能无法通过强制转换返回。该代码有什么用途?我认为泛型是为了避免铸件…@vulkanino引用转换。这段代码来自一本书。
StringBuilder Foo<T> (T arg)
{
 StringBuilder sb = arg as StringBuilder;
 if (sb != null) return sb;
 ...
}
(StringBuilder) (object) arg