我希望这个问题是正确的,所以让我们举个例子。想象一下以下通用方法:
public abstract class Base : IDisposable
{
public static IEnumerable<T> GetList<T>()
where T : Base
{
// To ensure T inherits from Base.
if (typeof(T) is Base)
throw new NotSupportedException();
// ...
}
}
根据MSDN http://msdn.microsoft.com/de-DE/library/bb384067.aspx关键字where
限制类型参数T
属于类型Base
或者从这个类继承。
[...] where 子句可以包含基类约束,该约束声明类型必须将指定的类作为基类(或者是该类本身)才能用作该泛型类型的类型参数。
这段代码也可以编译:
public static T GetFirst()
where T : Base
{
// Call GetList explicitly using Base as type parameter.
return (T)GetList<Base>().First();
}
所以当遵循最后一个代码时typeof(T)
应该返回Base
,不应该吗?为什么 Visual Studio 会向我打印此警告?
警告 CS0184:给定的表达式绝不是提供的(“Demo.Base”)类型。
typeof(whatever)
总是返回类型的实例Type
. Type
不源自Base
.
你想要的是这样的:
if(typeof(T) == typeof(Base))
throw new NotSupportedException("Please specify a type derived from Base");
看起来相同的东西是这样的:
if(variableOfTypeT is Base)
但这有不同的含义。
第一条语句(与typeof(Base)
)仅是true
if T
is Base
。这将是false
对于任何派生自的类型Base
.
第二条语句(variableOfTypeT is Base
) 总是true
在你的班级中,因为任何派生自Base
将返回true
检查其基类。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)