匿名类型不是匿名的
c#
我有一个具有字符串属性的类:
public class User
{
public string Name { get; set; }
public int OtherProperty { get; set; }
}
我可以Name从List<User> MyListOfUsers像这样选择s的列表:
List<string> MyNames = MyListOfUsers.Select(x => x.Name).ToList();
在我偏心的情况下,我首先尝试通过匿名类型来做同样的事情:
List<string> MyNames = MyListOfUsers.Select(x => new { x.Name }).ToList();
但这告诉我
无法转换类型
List< <anonymous type: string Name> > to List<string>
但它知道这是一个字符串?当它清楚地知道“匿名类型”是一个字符串时,为什么它不允许这种语法?
回答
您正在创建的匿名类型不是字符串。它是一个具有名为 Name 的字符串属性的类。
你的代码相当于
List<string> MyNames = MyListOfUsers.Select(x => new { Name = x.Name }).ToList();
但是 C# 允许您通过说new {x.Name}而不是从源推断匿名类的属性名称new {Name = x.Name}。
C# 中的匿名类型是从对象继承的类,即使它们只包含一个字符串属性,它们也不能像文档解释的那样转换为字符串:
匿名类型是直接从 object 派生的类类型,不能转换为 object 以外的任何类型。
至于你的初衷,这是正确的
List<string> MyNames = MyListOfUsers.Select(x => x.Name).ToList();
新匿名类的使用不仅会是不同的语法,还会导致不同的内存占用和 GC 负载。在您的用例中这是不必要的。