genericsNOT约束在T:!IEnumerable

按照标题,是否有可能在c#4中声明types – 否定约束?

不,在C#和CLR中都没有这样的概念。

据我所知,这是不可能的。

你可以做的是一些运行时检查:

 public bool MyGenericMethod<T>() { // if (T is IEnumerable) // don't do this if (typeof(T).GetInterface("IEnumerable") == null) return false; // ... return true; } 

我发现我的自己试图执行在评论中提到的同一个案例

 void doIt<T>(IEnumerable<T> what) { } void doIt<T>(T whats) { } 

除了下面的代码引用第一个方法

 doIt(new List<T>()); 

但它实际上引用了第二个

一种解决方法是像这样投下参数:

 doIt(new List<T>().AsEnumerable<T>()); 

演员可以被另一个超载隐藏:

 void doIt<T>(List<T> whats) { doIt(whats.AsEnumerable<T>()); } 

你使用一个约束,所以你可以确保你使用的types有一些属性/方法/ … 你想要使用

具有types否定约束的generics没有任何意义,因为没有任何目的来知道不想使用某些属性/方法。

不,但是可以用“是”来检查,然后适当地处理它。

一个用于这个将是一个选项types。

 public class Option<A,B> where A : !B where B : !A { private readonly A a; private readonly B b; private Option(){} public Option(A a) { this.a = a } public Option(B b) { this.b = b } } 

运行时检查当然会起作用,但是在编译时你不会有types检查的好处。