此代码在LinqPad中创建。结果是,在没有显式转换的情况下,它在调用构造函数时创建一个新的测试列表。为什么?我的想法是编译器在优化代码时如何处理机箱变量涉及慢速查询或静态列表和enuerator。
编辑:我在linq查询中创建的每个Test对象中都有一个新的List,因此hashcode转储看起来像是并且它们都引用到不同的列表。
58450264 41170820 58857649 541983
void Main()
{
List<Test> test= new List<Test>();
//with static list, it works correctly
// test.AddRange(new []{"A", "B", "C"}.Select(u=> new Test(u,test)).ToList());
// test.Count.Dump();
// test[0]._test.Count().Dump();
// test[1]._test.Count().Dump();
//This works incorrectly
this.Users.Select(u=> new Test(u.Name,test)).ForEach(t => test.Add(t));
//This works corrrectly
//this.Users.Select(u=> new Test(u.Name,(IList<Test>)test)).ForEach(t => test.Add(t));
test.Count.Dump();
test[0]._test.Count().Dump();
test[1]._test.Count().Dump();
test[2]._test.Count().Dump();
test.GetHashCode().Dump();
test[0]._test.GetHashCode().Dump();
test[1]._test.GetHashCode().Dump();
test[2]._test.GetHashCode().Dump();
}
public class Test
{
public IList<Test> _test;
public Test(string name, IList<Test> test)
{
_test = test;
}
}