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

时间:2017-09-05 13:40:01

标签: c# linq anonymous-types

此代码:

var items = query.ToList();

返回List<'a> 'a is new { string a1, string a2 }

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

4 个答案:

答案 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 featuresBetter 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>类型的非匿名祖先 - IListIEnumerable

IList items = query.ToList();