限制方法 where T : IEnumerable<T> 的约束条件

5

不时地,我会尝试挑战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()方法是否可能呢?每次传递集合时,都会期望一个集合的集合。
如果不可能,难道不应该在编译时报错吗?

2
编译器无法知道这一点。虽然 T: IEnumerable<T> 可能没有意义,但 T : IComparable<T> 却非常有意义,并且实际可用。 - SWeko
2个回答

2

当然:

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);

很好,很容易忽略最明显的解决方案 :) - Bart Juriewicz

0

虽然对于 IEnumerable<T> 来说没有多大意义,但是 实际上这种模式被广泛使用(一个快速的例子 - IComparable<T>),因此让编译器抛出错误会适得其反。


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