我希望这个问题是正确的,所以让我们举个例子。想象一下以下通用方法:
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') 类型。
T
继承自Base
是无用的,因为泛型约束已经确保了这一点。 - CodesInChaosT
要么继承自Base
或者 就是Base
本身。我希望T
只能从Base
继承。 - Carsten