17

我希望这个问题是正确的,所以让我们举个例子。想象一下以下通用方法:

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') 类型。

4

2 回答 2

23

typeof(whatever)总是返回一个类型的实例TypeType不是从Base.

你想要的是这样的:

if(typeof(T) == typeof(Base))
    throw new NotSupportedException("Please specify a type derived from Base");

看起来是一样的东西是这样的:

if(variableOfTypeT is Base)

但这有不同的含义。
第一个语句(with typeof(Base))仅是trueif Tis Base。它将false适用于从Base.
第二条语句 ( variableOfTypeT is Base) 始终true在您的类中,因为任何派生自的类Base都将返回true以检查其基类。

于 2013-02-13T13:30:01.123 回答
4

这不是你检查继承的方式。

typeof(T)是类型System.Type,不是Base。要查看 T 是否从 Base 派生,您应该使用IsSubclassOf 方法,如下所示:

if(typeof(T).IsSubclassOf(typeof(Base))  ... 
于 2013-02-13T13:33:55.213 回答