匿名类型不是匿名的

c#

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

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

我可以NameList<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 负载。在您的用例中这是不必要的。


以上是匿名类型不是匿名的的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>