此代码:
var items = query.ToList();
返回List<'a>
1>的'a is new { string a1, string a2 }
如果我要移除var
关键字,那么在此处使用的有效类型定义是什么,可以保留名称a1
和a2
?
答案 0 :(得分:10)
没什么,因为它是一个匿名类型的列表。选择了“匿名类型”这个术语,因为该类型没有名称。
如果您希望能够使用显式类型,请不要使用匿名类型。创建自己的类型,或(在C#7中)使用C#元组类型。 (常规System.Tuple
类型不允许您保留所需的名称。)
答案 1 :(得分:3)
您的查询返回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或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();
答案 2 :(得分:0)
关于匿名类型的观点是它们在设计时(编写代码时)不可用。编译代码时,它们将被编译器隐藏在某处。他们拥有名称,并且设计得当,但设计时无法通过设计进入类型。
这就是你使用var
的原因;让编译器弄清楚它实际上是什么类型,因为编译器是这里唯一可以告诉你“类型在哪里”的实例。
如果您可以在设计时用真实的东西替换var
,那么您也可以将new { … }
替换为new Whatever { … }
,这会使此类型为更长的匿名。 - 因此,如果您希望使用类型而不是var
,请自行定义实际类型。请记住,这样做实际上并不会影响编译器为您做的事情;现在只是你在写那个类声明。
答案 3 :(得分:0)
唯一可能的方法是将结果向下转发给List<'a>
类型的非匿名祖先 - IList
或IEnumerable
:
IList items = query.ToList();