如何正式定义这个 'var' 类型?

How to define this 'var' type formally?

此代码:

var items = query.ToList();

returns List<'a> 其中 'a is new { string a1, string a2 }

如果我要删除 var 关键字,此处使用的保留名称 a1a2 的有效类型定义是什么?

没什么,因为它是一个匿名类型的列表。之所以选择术语 "anonymous type",是因为该类型没有名称。

如果您希望能够使用显式类型,请不要使用匿名类型。创建您自己的类型,或(在 C# 7 中)使用 C# 元组类型。 (常规 System.Tuple 类型不会让您保留所需的名称。)

您的查询返回 anonymous type,因此您不知道编译时的类型名称。如果要将 var 项目删除为自定义类型而不是匿名类型。

如果您需要删除 var 并知道类型,则不要使用匿名类型。看看:Why use anonymous types instead of creating a class


要按照您的评论使用某些内容:List< { string a1, string a2 } > 查看 C# 7.0 中的命名元组。你看看C# 7.0 new features or Better naming in Tuple classes than "Item1", "Item2"

以下内容:

List(string a1, string a2) result = (from item from collection
                                    select new (string a1, string a2) 
                                        { "firstString", "secondString" }).ToList();

关于匿名类型的要点是它们在设计时(编写代码时)可用。编译代码时,它们将在编译器隐藏的某个地方提供。它们 名称,并且设计得当,但在设计时无法访问这些类型。

这就是您使用 var 的原因;让编译器弄清楚这实际上是什么类型,因为编译器是这里唯一可以告诉您类型“在哪里”的实例。

如果您 可以 在设计时将 var 替换为真实的东西,那么您也可以将 new { … } 替换为 new Whatever { … }将使这种类型不再是匿名的。 – 因此,如果您 想要 使用类型而不是 var ,请自己定义一个实际类型。请记住,无论如何,这样做实际上与编译器为您所做的没有区别;现在只有你在写 class 声明。

唯一可能的方法是将结果向下转换为 List<'a> 类型的非匿名祖先 - IListIEnumerable:

IList items = query.ToList();