泛型 - 打开和关闭构造的类型

时间:2009-11-14 17:56:08

标签: c# generics

最近我注意到通用构造类型可以打开和关闭。但我不明白他们究竟是什么意思。你能给出一个简单的例子吗?

3 个答案:

答案 0 :(得分:64)

在实践中,术语并不重要 - 我记不起上次我不得不担心除了在试图写它时。

  • 未绑定类型未指定类型参数
  • 构造的类型至少指定了一个类型参数
  • 类型参数是开放类型
  • 元素类型处于打开状态的数组类型是打开类型
  • open 构造类型至少有一个类型参数,它是一个开放类型
  • 已关闭类型是任何未打开的类型

(嵌套类型还有其他规则。有关血淋淋的详细信息,请参阅C#3.0规范第4.4节。)

作为开放构造类型的示例,请考虑:

public class NameDictionary<T> : Dictionary<string, T>

typeof(NameDictionary<>)的基类是:

  • 构造因为它指定了类型参数
  • 打开,因为第二个类型参数(T)是开放式

Type.IsGenericType的MSDN文档有一个非常有用的小表。

重申一下,这在日常使用中几乎完全不重要。

我一般都赞成知道正确的术语 - 特别是对于“通过参考传递”等等 - 但在这种情况下,它确实不会经常出现。我想积极劝阻你不要担心:)

答案 1 :(得分:7)

来自MSDN

  

如果可实例化类型已替换其所有类型参数(包括所有封闭类型的所有类型参数),则关闭泛型类型或方法。如果关闭,则只能创建泛型类型的实例。

因此List<int> 已关闭

var list = Activator.CreateInstance(typeof(List<int>));

但是这会在运行时抛出异常,因为List<> 打开

var list = Activator.CreateInstance(typeof(List<>));
                                               ↑

答案 2 :(得分:3)

我主要在依赖注入映射中使用开放泛型(基本上是未实例化的泛型)。例如,像

Bind<IRepository<>>()
   .To<BasicRepository<>>()

然后,当我的对象构造函数包含:

public SomethingController(IRepository<Something>) { ... }

我的依赖注入机制将实例化一个BasicRepository&lt;什么&gt;自动的。 (这适用于Ninject和StructureMap,可能还有Castle Windsor库;我不确定其他框架。)