首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >泛型和匿名类型

泛型和匿名类型
EN

Stack Overflow用户
提问于 2010-04-01 23:19:00
回答 3查看 801关注 0票数 2

我理解,泛型通常是为了编译时的安全,并允许我们保持强类型的collection.Then泛型如何允许我们存储匿名类型,比如

代码语言:javascript
复制
List<object> TestList = new List<object>();
TestList.Add(new { id = 7, Name = "JonSkeet" });
TestList.Add(new { id = 11, Name = "Marc Gravell" });
TestList.Add(new { id = 31, Name = "Jason" });
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-04-01 23:24:14

这是因为object是.Net中所有实例的根类型。因此,任何表达式都可以用于需要object的位置,因为它们都满足System.object的基本约定。

例如,以下内容是完全合法的。

代码语言:javascript
复制
List<object> TestList = new List<object>();
TestList.Add(new { id = 7, Name = "JonSkeet" });
TestList.Add("Foo");
TestList.Add(42);
票数 9
EN

Stack Overflow用户

发布于 2010-04-01 23:21:23

因为所有东西都是(或者可以装箱到)一个object,这就是objects的List

票数 7
EN

Stack Overflow用户

发布于 2010-04-02 00:17:29

其他人已经解释了为什么你的代码工作-你的例子是强类型的,因为一切都是对象,但这意味着它不是很有用。您不能从列表中获取元素并访问例如它们的Name属性,因为它们只是对象,所以这通常不起作用。

但是,也可以创建匿名类型的强类型List --只需使用如下所示的小实用方法即可完成:

代码语言:javascript
复制
static List<T> CreateList<T>(params T[] items) {
  return items.ToList();
}

问题是不能在不提供类型名称的情况下调用构造函数。当调用一个方法时,C#可以推断类型参数,所以你可以这样写:

代码语言:javascript
复制
var testList = CreateList(
  new { id = 7, Name = "JonSkeet" },
  new { id = 11, Name = "Marc Gravell" });
testList.Add(new { id = 31, Name = "Jason" });

这是完全类型安全的,例如,您可以编写testList[0].Name来获取第一个人的名字。如果您尝试编写类似testList.Add(42)的代码,您将得到一个编译时错误,因为该列表被强类型化为只包含具有idName属性的匿名类型。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2561457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档