C# 用泛型重载 : bug or feature?

标签 c# generics c#-3.0 constraints overloading

让我们举一个简单的例子:

void Foo<T>(IEnumerable<T> collection, params T[] items) 
{
    // ...
}

void Foo<C, T>(C collection, T item)
    where C : ICollection<T>
{
    // ...
}

void Main()
{
    Foo((IEnumerable<int>)new[] { 1 }, 2);
}

编译器说:

The type 'System.Collections.Generic.IEnumerable' cannot be used as type parameter 'C' in the generic type or method 'UserQuery.Foo(C, T)'. There is no implicit reference conversion from 'System.Collections.Generic.IEnumerable' to 'System.Collections.Generic.ICollection'.

如果我将 Main 更改为:

void Main()
{
    Foo<int>((IEnumerable<int>)new[] { 1 }, 2);
}

它会正常工作。为什么编译器不选择正确的重载?

最佳答案

我的猜测是编译器在使用通用约束之前会选择最佳匹配。在您的示例中,带有约束的方法更可取,因为它没有 params 最后一个参数。

编辑 - Eric Lippert 在他的回答中证实了这一点。

关于C# 用泛型重载 : bug or feature?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2586666/

相关文章:

C# 如何提取完整的xml节点集

c# - 使功能区最小化时显示功能区 ContextualTabGroups

c# - 如何模拟多个查询字符串?

c# - EmptyResult 上的 jQuery AJAX 请求炸弹

android - 期望意外类型的 Kotlin 泛型

c#-3.0 - Lambda for Dummies....任何人,任何人?我想不是

c# - 如何以编程方式从 XMS XMSException 检索原因代码

java - 为什么java泛型允许在HashMap<Integer,String>的get中传递 boolean 值

java - 存储在列表中时是否可以检索泛型类型?

asp.net - ASP.NET (C# .NET 3.5) 的最佳单元测试框架是什么?