我问了这个问题.由于这里解释的原因(即使我期望在运行时而不是编译时错误),此代码无法编译("无法转换Generic<T>为T").InvalidCastException
class NonGeneric
{
}
class Generic<T> : NonGeneric
where T : NonGeneric
{
T DoSomething()
{
return (T)this; // ** Cannot convert...
}
}
Run Code Online (Sandbox Code Playgroud)
接受的解决方案给出了这个解决方法:
T DoSomething()
{
return this as T;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:为什么?as运算符应该完全等同于强制运算符:
as运算符就像一个强制转换操作.但是,如果无法进行转换,则返回null而不是引发异常.
如果this as T应该等于this is T? (T)this: (T)null那么为什么as T工作,(T)this甚至不编译?AFAIK演员阵容可用于更广泛的情况as:
请注意,as运算符仅执行引用转换,可空转换和装箱转换.as运算符不能执行其他转换,例如用户定义的转换,而应使用转换表达式执行转换.
那为什么呢?它是as操作员的记录功能吗?它是泛型类型的编译器/语言限制吗?请注意,此代码编译正常:
return (T)((object)this);
Run Code Online (Sandbox Code Playgroud)
这是因为编译器不能确定是否T是 …
我有一个 List<object>各种类型的对象的集合.
我正在编写一个辅助方法,它将返回一个特定类型的对象.辅助方法将接受类型名称作为字符串参数.
注意:我使用的是3.5框架.