我希望这个问题是正确的,所以让我们举个例子。想象一下以下通用方法:
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,关键字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') 类型。