【问题标题】:Generics open and closed constructed types泛型开放和封闭构造类型
【发布时间】:2010-12-16 15:24:46
【问题描述】:

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

【问题讨论】:

    标签: c# generics


    【解决方案1】:

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

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

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

    作为一个开放构造类型的例子,考虑:

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

    typeof(NameDictionary&lt;&gt;) 的基类是:

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

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

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

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

    【讨论】:

    • 现在我面临的大多数面试问题都是从你的书中提出的。所以为了澄清的目的,我问了。 :) .
    • @generixs:如果有人在采访中问我这个问题,我会承认如果不参考一本书或规范我就无法说出来:) 这不是一个非常有用的采访问题,我有说。
    • :) 给我你的大脑的一部分,这样我就可以像 Jon Skeet 一样回答 ..(抱歉开玩笑..)。
    • 总而言之:如果我们找到任何类型参数,那么它就是一个绑定/构造类型(否则它是未绑定的),如果我们找到任何类型参数,那么它就是一个开放类型(否则它是封闭的)。封闭类型不能解除绑定。我遗漏了什么大的吗?
    • @Jon ... lolz... 这实际上是一个很好的回应。我对它们的了解越多,我就越觉得它们从一开始就不是供人类食用的。
    【解决方案2】:

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

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

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

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

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

    【讨论】:

    【解决方案3】:

    来自MSDN

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

    所以这是因为List&lt;int&gt; 已关闭

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

    但这会在运行时引发异常,因为List&lt;&gt;open

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

    【讨论】:

    • 在这种情况下,它也是一个未绑定的类型——开放的、构造的类型是更深奥的类型:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多