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