【发布时间】:2014-09-25 11:28:05
【问题描述】:
代码示例:
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
(value) 被接受。 -
@VictorMukherjee:事实上,我想了解,是什么阻止了编译器在没有任何额外提示的情况下定位
Bar<T>(IEnumerable<T> value)。乍一看,没有什么可以阻止它。
标签: c# generics overload-resolution