在linq中使用var

maz*_*ztt 8 linq anonymous-types

是什么var在以下情况下真的?

var productInfos =
from p in products
select new { p.ProductName, p.Category, Price = p.UnitPrice };
Run Code Online (Sandbox Code Playgroud)

mrm*_*reg 9

这两行:

var productInfos = from p in products 
select new { p.ProductName, p.Category, Price = p.UnitPrice };
Run Code Online (Sandbox Code Playgroud)

IEnumerable<CompilerGeneratedType> productInfos = from p in products 
select new { p.ProductName, p.Category, Price = p.UnitPrice };
Run Code Online (Sandbox Code Playgroud)

是等价的. CompilerGeneratedType是一种将由编译器创建并具有三个公共属性的类型ProductName, Price, and Category. var有两个原因:

  1. CompilerGeneratedType 将由编译器生成,因此您无法在声明中使用类型名称.
  2. 您不必过于考虑结果的集合类型.Linq可以做到这一点,你不必担心它.

  • 这是一个很好的答案,但不是100%正确.很有可能引用CompilerGeneratedType.不是直接按名称,但间接地.例如:var test = new {P1 ="Hello",P2 ="Bye"}; 输入t = test.GetType(); 产生具体名称的具体类型,在我的具体示例中,UnderlyingSystemType:{<> f__AnonymousType0`2 [System.String,System.String]}. (2认同)

Eri*_* J. 7

var是编译器创建("匿名")类型的占位符,它具有三个属性ProductName,CategoryPrice.

它不是变体(例如在Visual Basic中).它是一种具体类型,可以在代码中的其他位置使用.