具有约束的通用方法的重载解析问题

丹尼斯

代码示例:

interface IFoo { }
class FooImpl : IFoo { }

static void Bar<T>(IEnumerable<T> value)
    where T : IFoo
{
}

static void Bar<T>(T source)
    where T : IFoo
{
}

谁能解释,为什么此方法调用:

var value = new FooImpl[0];
Bar(value);

目标Bar<T>(T source)(因此不编译)?

解决重载时,编译器是否完全考虑类型参数约束?

UPD

为了避免与数组混淆。发生在的任何实现中IEnumerable<T>,例如:

var value = new List<FooImpl>();

UPD 2

@ ken2k提到了协方差。但是,让我们忘记吧FooImpl这:

var value = new List<IFoo>();
Bar(value);

产生相同的错误。
我敢肯定,List<IFoo>之间IEnumerable<IFoo>存在隐式转换,因为我可以轻松编写如下代码:

static void SomeMethod(IEnumerable<IFoo> sequence) {}

并传递value给它:

SomeMethod(value);
斯坦利

解决重载时,编译器是否完全考虑类型参数约束?

否,因为通用约束不是函数签名的一部分。您可以通过添加Bar与常规约束相同重载来验证这一点

interface IBar { }

static void Bar<T>(IEnumerable<T> value)
    where T : IFoo
{
}

static void Bar<T>(T source)
    where T : IBar
{
    // fails to compile : Type ____ already defines a member called 'Bar' with the same parameter types
}

您的代码无法编译的原因是,编译器会根据方法签名选择“最佳”匹配项,然后尝试应用通用约束。

可能这样做的一个可能原因是,此调用会模棱两可:

{假设List<T>有一个Add<T>(IEnumerable<T> source)方法}

List<object> junk = new List<object>();
junk.Add(1);   // OK
junk.Add("xyzzy") // OK
junk.Add(new [] {1, 2, 3, 4});  //ambiguous - do you intend to add the _array_ or the _contents_ of the array?

明显的解决方法是为采用Bar集合方法使用不同的名称(就像在BCL中使用Add和一样AddRange

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

具有约束的Scala通用类型

来自分类Dev

从无约束的方法中调用具有约束的通用类型的方法

来自分类Dev

有约束的问题

来自分类Dev

具有约束属性的MVC中的路由问题

来自分类Dev

使用具有约束类型的方法的Typeclass实例

来自分类Dev

具有约束的Haskell实例

来自分类Dev

设置具有约束的分区Java

来自分类Dev

计算具有约束的重复行

来自分类Dev

具有约束的EF自参考

来自分类Dev

受约束的通用参数的奇怪方法重载解析:总是调用基类arg的重载

来自分类Dev

具有通用类类型约束的通用方法

来自分类Dev

带有约束的通用打字稿没有密钥

来自分类Dev

具有约束类和结构的 List<T> 的扩展方法

来自分类Dev

通用向量类中的重载解析问题

来自分类Dev

当其中一个函数具有带有约束的通用参数时,无法声明两个具有相同名称的函数

来自分类Dev

有约束的排序

来自分类常见问题

背包问题变化几乎没有约束

来自分类Dev

背包问题变化几乎没有约束

来自分类Dev

具有约束力的最佳实践

来自分类Dev

Laravel ORM具有约束的嵌套关系

来自分类Dev

C#从具有约束的泛型推断类型

来自分类Dev

R-具有约束的数据框的组合

来自分类Dev

具有约束类的Rails路由无法正常工作

来自分类Dev

使用networkx在边缘上具有约束的图同构

来自分类Dev

在R中具有约束的矩阵调整大小

来自分类Dev

隐藏具有约束和动画的视图

来自分类Dev

如何以编程方式创建具有约束的视图

来自分类Dev

CloudKit无法与具有约束的CoreData同步

来自分类Dev

遍历具有约束的0、1的列表