C# 泛型打开和关闭构造类型

C# 泛型打开和关闭构造类型,c#,generics,C#,Generics,最近我注意到泛型构造类型可以是打开的和关闭的。但我不明白他们到底是什么意思。你能举个简单的例子吗?来自: 如果泛型类型或方法的所有类型参数(包括所有封闭类型的所有类型参数)都已替换为可实例化类型,则泛型类型或方法将关闭。只有关闭泛型类型的实例时,才能创建该实例 因此,这就像列表已关闭一样: var list = Activator.CreateInstance(typeof(List<int>)); var list = Activator.CreateInstance(typeo

最近我注意到泛型构造类型可以是打开的和关闭的。但我不明白他们到底是什么意思。你能举个简单的例子吗?

来自:

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

因此,这就像
列表
已关闭一样:

var list = Activator.CreateInstance(typeof(List<int>));
var list = Activator.CreateInstance(typeof(List<>));
                                               ↑
var list=Activator.CreateInstance(typeof(list));
但这会在运行时引发异常,因为
列表
打开的

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

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

  • 未绑定类型没有指定类型参数
  • 构造的类型至少指定了一个类型参数
  • 类型参数是开放类型
  • 元素类型为打开的数组类型是打开类型
  • 开放构造的类型至少有一个类型参数是开放类型
  • 闭合类型是指任何未打开的类型
(嵌套类型还有更多规则。有关详细信息,请参阅C#3.0规范第4.4节。)

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

public class NameDictionary<T> : Dictionary<string, T>
公共类名称字典:字典
typeof(NameDictionary)
的基类是:

  • 构造,因为它指定类型参数
  • 打开,因为第二个类型参数(
    T
    )是打开类型
的MSDN文档有一个非常有用的小表格

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


我通常赞成知道正确的术语——特别是对于“通过引用传递”之类的术语——但在这种情况下,它真的,真的不经常出现。我想极力劝阻您不要担心它:)

我在依赖项注入映射中主要使用了开放泛型(基本上是非实例化泛型)。比如说

Bind<IRepository<>>()
   .To<BasicRepository<>>()
Bind()
.至()
然后,当我的对象构造函数包含:

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

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

在这种情况下,它也是一种未绑定的类型——一种开放、构造的类型更为深奥:)现在几天来,我面对的大多数面试问题都是从你的书中提出的。为了澄清起见,我问了:)@一般情况:如果有人在面试中问我这个问题,我会承认,如果不查阅一本书或说明书,我就不能说:)这不是一个非常有用的面试问题,我必须说::)给我一部分你的大脑,这样我就可以像回答Jon Skeet一样回答了……(对不起,开玩笑……)总之:如果我们找到任何类型参数,那么它是一个绑定/构造的类型(否则它是未绑定的),如果我们找到任何类型参数,那么它是一个开放类型(否则它是关闭的)。闭合类型不能解除绑定。我有漏掉大的吗?@Jon。。。哈哈。。。这实际上是一个很好的回应。我对它们读得越多,就越觉得它们根本就不适合人类使用。
Autofac
也支持开放泛型类型:就像它一样