我在这个问题中提问。 这段代码不能编译("Cannot convert Generic<T>
to T
"),原因在这里解释了(即使我期望在运行时会发生InvalidCastException
, 而不是编译时错误)。
class NonGeneric
{
}
class Generic<T> : NonGeneric
where T : NonGeneric
{
T DoSomething()
{
return (T)this; // ** Cannot convert...
}
}
已接受的解决方案给出了以下解决方法:
T DoSomething()
{
return this as T;
}
我的问题是:为什么? as运算符应该与强制转换操作符完全等效:
as运算符类似于强制转换操作。但是,如果无法进行转换,则as返回null而不是引发异常。
如果this as T应该等同于this is T?(T)this:(T)null,那么为什么as T有效而(T)this甚至无法编译?据我所知,强制转换可以在比as更广泛的情况下使用:
请注意,as运算符仅执行引用转换、可空转换和装箱转换。 as运算符不能执行其他转换,例如用户定义的转换,应使用强制转换表达式执行。
那么这是为什么?这是as运算符的文档功能吗?这是具有通用类型的编译器/语言限制吗?请注意,此代码可以编译成功:
return (T)((object)this);
这是因为编译器无法确定 T
是否为 dynamic
(即使有 where
约束),所以它将始终生成这样的代码吗?