通用约束排除

4

抱歉问一个愚蠢的问题

是否可能以这样的方式对泛型强制执行约束,使得给定的T可以从任何引用类型中派生,除了一些A、B、C(其中A、B、C是引用类型)。(即)

Where T : class except A,B,C

4
也许如果你解释一下想要用这个做什么,会更有帮助。 - Joel Coehoorn
@Joel 纠正完比特后,我会发布我的代码并解释为什么需要它。谢谢 Joel。 - user196546
4个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
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)
                ));
        }
    }
}

2
如果你将检查移到静态构造函数中,它只会在类的新实例被创建时运行一次,而不是每次都运行。然而,由于调试问题,重要的是在这种情况下包含一个适当的错误消息,以及 NotSupportedException。我编辑了帖子来使用这个方法。 - Sam Harwell

3
不,你只能指定它继承自特定类型、是值类型或引用类型,或者必须有默认构造函数。请记住,这是为了编译器的利益而不是开发人员的利益。 :) 你最好能在运行时抛出异常。

1

抱歉,不行。你可以在这里找到如何约束的方法...


0

不行。类型不能被否定。where子句只允许你限制到特定的类型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,