genericsNOT约束在T:!IEnumerable

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

6 Solutions collect form web for “genericsNOT约束在T:!IEnumerable”

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

  • C#中有一个“空列表”单例吗?
  • 将DataRowCollection转换为IEnumerable <T>
  • 在List <T>和IEnumerable <T>之间自由转换
  • C#:如何使IEnumerable <T>线程安全?
  • IEnumerable Count()和Length之间的区别
  • collections被修改; 枚举可能不会执行错误从LIstBox中删除一个ListItem
  • 如何批量循环浏览IEnumerable
  • 为什么IEnumerable <T>在C#4中是协变的?
  • 如何将两个IEnumerable <T>连接成一个新的IEnumerable <T>?
  • 推荐的方法来检查一个序列是否为空
  • IEnumerable和IEnumerable <T>之间的区别?