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检查的好处。