泛型开放式和封闭式构造类型

问题描述 投票:0回答:3

最近我注意到泛型构造类型可以是开放的和封闭的。但我不明白它们的真正含义。能举个简单的例子吗

c# generics
3个回答
90
投票

实际上,术语并不重要——我不记得上次我不得不担心它是什么时候了除了当我试图写它的时候。

  • 未绑定类型没有指定类型参数
  • 一个构造类型至少指定了一个类型参数
  • 类型参数是 开放类型
  • 元素类型为开放的数组类型是开放类型
  • 一个 open 构造类型至少有一个类型参数,它是一个开放类型
  • 封闭类型是任何不开放的类型

(嵌套类型还有更多规则。有关详细信息,请参阅 C# 3.0 规范第 4.4 节。)

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

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

typeof(NameDictionary<>)
的基类是:

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

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

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

我通常赞成了解正确的术语 - 特别是对于“通过引用传递”等内容 - 但在这种情况下,它确实非常不经常出现。我想积极劝阻您不要担心:)


11
投票

来自MSDN

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

所以这可以作为

List<int>
关闭:

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

但这会在运行时引发异常,因为

List<>
open:

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

4
投票

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.