如果匿名类型应该是不可变的,为什么可以更改它?

bri*_*nch 3 c# linq

我以为我对匿名类型有很好的理解,但这个小代码片段让我有些困惑:

string[] arr = { "Agnes", "Allan", "Benny" };

var result = arr.Where(a => a.StartsWith("A")).Select(a => a);

// Why can I do the below, if arr is immutable?
result = arr.Where(a => a.EndsWith("n")).Select(a => a);
Run Code Online (Sandbox Code Playgroud)

我不明白为什么我被允许分配第二个值result.我的意思是不是匿名类型是不可变的,它们在获得初始值后无法更改?

Hab*_*bib 11

首先,没有涉及匿名类型.


string[] arr = { "Agnes", "Allan", "Benny" };是一个数组创建表达式.

resultIEnumerable<string>和在两个LINQ语句中,您只是创建一个查询.

这是怎么回事:

数组创建表达式

string[] arr = { "Agnes", "Allan", "Benny" }; 
Run Code Online (Sandbox Code Playgroud)

查询arr并返回 IEnumerable<string>

var result = arr.Where(a => a.StartsWith("A")).Select(a => a); 
Run Code Online (Sandbox Code Playgroud)

在arr返回时为结果分配一个新查询 IEnumerable<string>

result = arr.Where(a => a.EndsWith("n")).Select(a => a); 
Run Code Online (Sandbox Code Playgroud)

至于理解不变性,想想String看看这篇文章:不可变类型:了解它们的好处并使用它们

  • @brinch匿名类型很难从方法返回,或者传递给其他方法.它们用于在方法中"存储""临时数据".有一个可怕的黑客返回一个匿名类型,或者你可以使用`dynamic`(但通常你不应该返回一个匿名对象) (2认同)