首页 > 解决方案 > 匿名类型不是匿名的

问题描述

我有一个具有字符串属性的类:

public class User
{
    public string Name { get; set; }
    public int OtherProperty { get; set; }
}

我可以像这样选择Names的列表List<User> MyListOfUsers

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>

但它知道这是一个字符串吗?当它清楚地知道“匿名类型”是一个字符串时,为什么它不允许这种语法?

标签: c#

解决方案


您正在创建的匿名类型不是字符串。它是一个具有名为 Name 的字符串属性的类。

您的代码相当于

List<string> MyNames = MyListOfUsers.Select(x => new { Name = x.Name }).ToList();

但是 C# 允许您通过说new {x.Name}而不是new {Name = x.Name}.

C# 中的匿名类型是从 object 继承的类,即使它们只包含一个字符串属性,它们也不能转换为字符串,如文档所述:

匿名类型是直接从 object 派生的类类型,并且不能转换为除 object 之外的任何类型。

至于你的初衷,这是正确的

List<string> MyNames = MyListOfUsers.Select(x => x.Name).ToList();  

使用新的匿名类不仅是语法不同,还会导致不同的内存占用和 GC 负载。在您的用例中是不必要的。


推荐阅读