【问题标题】:where T : IEnumerable<T> method constraint其中 T : IEnumerable<T> 方法约束
【发布时间】:2014-11-17 13:03:04
【问题描述】:

我有时会尝试折磨 C# 编译器。今天我想出了这个:

static void CallFirst<T>(T a) where T : IEnumerable<T>
{
    a.First().ToString();
}

这是一个简单的错误,因为我想创建一个以集合为参数的泛型方法,当然应该是这样的:

static void CallFirst2<T>(IEnumerable<T> a)
{
    a.First().ToString();
}

无论如何,甚至可以调用CallFirst() 方法吗?每次集合通过时,集合的集合都是预期的。

如果不是,不应该认为是编译时错误吗?

【问题讨论】:

  • 编译器无法知道这一点。虽然T: IEnumerable&lt;T&gt; 可能没有意义,但T : IComparable&lt;T&gt; 很有意义,而且它实际上是可用的。

标签: c# generics collections constraints


【解决方案1】:

当然:

class Test : IEnumerable<Test>
{
    IEnumerator<Test> IEnumerable<Test>.GetEnumerator()
    {
        throw new NotImplementedException();
    }

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        throw new NotImplementedException();
    }
}

    ...

var test = new Test();
CallFirst(test);

【讨论】:

  • 很好,很容易忽略最明显的解决方案 :)
【解决方案2】:

虽然对于IEnumerable&lt;T&gt;that pattern is widely used in fact(一个简单的例子 - IComparable&lt;T&gt;)来说意义不大,但让编译器抛出错误会适得其反。

【讨论】:

    猜你喜欢
    • 2012-02-02
    • 2011-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-19
    • 2017-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多