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

use*_*546 50 c# generics

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

Jon*_*eet 71

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

  • 一个未绑定类型已指定类型的参数
  • 构造类型具有至少一种类型的自变量指定
  • 类型参数是开放类型
  • 元素类型打开的数组类型是开放类型
  • 一个开放的构造类型具有至少一种类型的参数,它是一个开放型
  • 密闭型是任何类型的,其不开

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

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

public class NameDictionary<T> : Dictionary<string, T>
Run Code Online (Sandbox Code Playgroud)

基类typeof(NameDictionary<>)是:

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

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

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

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

  • @generixs:如果有人在接受采访时问我,我会承认,如果不咨询书籍或规范,我就无法说出来:)我不得不说,这不是一个非常有用的面试问题. (12认同)
  • @Jon ... lolz ......这实际上是一个很好的回应.我越了解他们,我就越觉得他们从来没有打算过人类消费. (3认同)

dtb*_*dtb 7

来自MSDN:

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

所以这List<int>关闭的:

var list = Activator.CreateInstance(typeof(List<int>));
Run Code Online (Sandbox Code Playgroud)

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

var list = Activator.CreateInstance(typeof(List<>));
                                               ?
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下,它也是一种未绑定的类型 - 虽然开放的构造类型是更深奥的类型:) (2认同)