为什么我通过使用IList().toList()出现错误结果.添加范围()?



这些是我的旧代码,无法响应正确的结果。

IList<string> testList=new List<string>();
testList.Add("string1");
var testList2=new List<string>(testList);
testList.ToList().AddRange(testList2);

我希望testList中有两个元素,但实际上它只有一个; 如果我将我的代码更改为新样式,它可以得到正确的结果。例:

IList<string> testList=new List<string>();
testList.Add("string1");
var testList2=new List<string>(testList);
var result=testList.ToList();
result.AddRange(testList2);

结果,它成功地具有两个元素。我想原因是 iList((.toList(( 在其他地方创建了一个新列表,作为参数结果,它独立于 iList((。对吗?还是其他原因?

命名空间System.Linq附带的所有扩展方法都会创建对象的新副本(如果愿意,也可以创建深层副本(。 因此,当您说在另一个内存位置创建新列表时,您是对的。

要确认两个对象是否不同,您可以通过 unsafe 获取它们的内存地址并亲自查看。以下是要测试的内容(如果您使用不安全的代码,请小心;您需要自己处理所有内存管理(:

unsafe
{
IList<string> testList = new List<string>();
testList.Add("string1");
var testList2 = new List<string>(testList);
testList.ToList().AddRange(testList2);
TypedReference original = __makeref(testList);
IntPtr originalPointer = **(IntPtr**)(&original);
var isThisANewList = testList;
TypedReference newReferenceOnly = __makeref(testList);
IntPtr newReferenceOnlyPointer = **(IntPtr**)(&newReferenceOnly);
var copy = testList.ToList();
TypedReference deepCopy = __makeref(copy);
IntPtr deepCopyPointer = **(IntPtr**)(&deepCopy);
}
ToList()

是一个返回列表的扩展方法。您没有将该值保存在变量中,因此尽管您调用AddRange(),但您正在添加到您在ToList()中创建的列表,而不是添加到您的 testList 中。

在第二个示例中,您正确地保存了结果中的ToList()值。

var result=testList.ToList();
result.AddRange(testList2);

您有几个选择...

// option 1 declare testList as a List not IList
List<string> testList = new List<string>();
testList.AddRange(testList2);
// option 2 cast testList as a List
((List<string>)testList).AddRange(testList2);

相关内容

  • 没有找到相关文章

最新更新