通用约束排除

时间:2009-11-13 19:20:26

标签: c# generics

很抱歉问愚蠢的问题

是否可以以可以导出给定T的方式对泛型强制执行约束 来自任何引用类型除了一些A,B,C(其中A,B,C是引用类型)。 (即)

Where T : class except A,B,C

4 个答案:

答案 0 :(得分:5)

没有。但是你可以在运行时检查这些类:

public class Foo<T>
{
    static Foo()
    {
        // one of the following depending on what you're trying to do
        if (typeof(A).IsAssignableFrom(typeof(T)))
        {
            throw new NotSupportedException(string.Format(
                "Generic type Foo<T> cannot be instantiated with {0} because it derives from or implements {1}.",
                typeof(T),
                typeof(A)
                ));
        }

        if (typeof(T) == typeof(A))
        {
            throw new NotSupportedException(string.Format(
                "Generic type Foo<T> cannot be instantiated with type {0}.",
                typeof(A)
                ));
        }
    }
}

答案 1 :(得分:3)

不,您只能指定 从特定类型继承,是值或引用类型,还是必须具有默认构造函数。请记住,这是为了编译器的利益,而不是开发人员。 :)

您可能做的最好的事情是在运行时抛出异常。

答案 2 :(得分:1)

抱歉。您可以了解如何限制here ...

答案 3 :(得分:0)

没有。没有类型的否定。 where子句只允许您禁用特定类型。