【发布时间】:2011-04-05 10:42:05
【问题描述】:
从 .NET 3.5 迁移到 4.0 后,我遇到了一个奇怪的问题,该函数导致 4.0 上的堆栈溢出,同时在 3.5 框架上完美运行。我用以下代码重现了这个问题:
public interface IPerson
{
string Name { get; }
}
public class Person : IPerson
{
public Person() { }
public Person(IPerson source)
{
this.Name = source.Name;
}
public string Name { get; set; }
}
public class PersonList : List<Person>
{
public void AddRange(IEnumerable<IPerson> source)
{
this.AddRange(source.Select(p => new Person(p)));
}
}
引发错误:
IPerson otto = new Person { Name = "Otto" };
IPerson fritz = new Person { Name = "Fritz" };
PersonList list = new PersonList();
IEnumerable<IPerson> persons = new[] { otto, fritz };
list.AddRange(persons); //works on 3.5, stack overflow on 4.0
看看PersonList的AddRange(IEnumerable<IPerson> source)方法。
在 3.5 中,方法 AddRange(IEnumerable<Person> source) 被调用,派生自 List<Person>。在 4.0 中,AddRange(IEnumerable<IPerson> source) 方法由于协方差而被调用(递归),尽管存在与输入参数完全匹配的参数 (IEnumerable<Person>I) 的更好匹配函数。
这种新行为是否有意并记录在案?
【问题讨论】:
标签: c#-4.0 covariance overloading