其中 T :IEnumerable 方法约束

本文关键字:方法 约束 IEnumerable 其中 | 更新日期: 2023-09-27 18:30:49

我不时地试图折磨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<T> 方法约束

当然:

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

虽然它对IEnumerable<T>没有什么意义,但该模式实际上被广泛使用(一个快速示例 - IComparable<T>),因此让编译器抛出错误会适得其反。