【问题标题】:Does .Net support curried generics?.Net 支持咖喱泛型吗?
【发布时间】:2011-04-08 23:33:08
【问题描述】:

假设我们有一个嵌套的泛型类:

public class A<T> {
    public class B<U> { }
}

这里,typeof(A&lt;int&gt;.B&lt;&gt;) 本质上是一个具有两个参数的泛型类,其中只绑定了第一个参数。

如果我有一个带有两个参数的类

public class AB<T, U> { }

有没有办法引用“AB T=intU 保持开放”?如果不是,这是 C# 限制还是 CLR 限制?

【问题讨论】:

  • 这可以用 F# 中的类型来完成吗?
  • 如果你问我,我不知道......我从来没有真正使用过 F#。
  • “咖喱”是指“部分关闭”?
  • 通过谷歌搜索,我发现了这篇博文:lostechies.com/jimmybogard/2009/09/01/…

标签: c# .net generics currying


【解决方案1】:

显然它不能在 C# 中完成,您必须指定两个类型参数,或者一个都不指定。

而且CLR好像也不支持,A&lt;int&gt;.B&lt;&gt;A&lt;string&gt;.B&lt;&gt;指的是同一个类型:

Type t1 = typeof(A<int>).GetNestedType("B`1");
Type t2 = typeof(A<string>).GetNestedType("B`1");
// t1.Equals(t2) is true

这两种类型的封闭类型都是A&lt;&gt;(开放泛型)

编辑:进一步测试表明 typeof(A&lt;int&gt;.B&lt;string&gt;) 实际上是 arity 2 的泛型类型,不是 arity 1 的嵌套泛型类型...typeof(A&lt;int&gt;.B&lt;string&gt;).GetGenericArguments() 返回一个带有 typeof(int) 的数组em>和 typeof(string)。所以typeof(A&lt;int&gt;.B&lt;&gt;)实际上等同于(A.B)&lt;int, &gt;,这是不支持的(泛型类型不能部分关闭)

【讨论】:

  • 你的观察是正确的。实际上,C.D 就是 "C.D"。 C# 将其视为 C.D 的方式只是一个方便的虚构。
  • @Eric,感谢您的确认。我希望你能看到这个问题并对此有所了解......如果你没有想法,这可能是一篇博客文章的好主题;)
  • 你是对的,当然。我的错误是假设typeof(A&lt;int&gt;.B&lt;&gt;) 是合法的——我知道A&lt;T&gt;.B&lt;U&gt; 被实现为A.B&lt;T, U&gt;,这意味着typeof(A&lt;int&gt;.B&lt;&gt;) 实际上是A.B&lt;int, &gt;,这似乎不应该是合法的。
【解决方案2】:

这是你的想法吗?

   class AB<T, U>
   {
      protected T t;
      U u;
   }

   class C<U> : AB<int, U>
   {
      public void Foo()
      {
         t = 5;
      }
   }

【讨论】:

  • @downvoter:跟我说话。您想查看反射器输出、C# 规范摘录或其他内容吗?
  • 看起来 OP 正在请求一个 Type 对象的实例,该对象表达类似 typeof(AB&lt;int,&gt;) 的内容。
猜你喜欢
  • 1970-01-01
  • 2012-10-16
  • 1970-01-01
  • 2018-02-02
  • 1970-01-01
  • 2017-06-28
  • 2020-07-09
  • 2014-11-19
  • 2018-11-09
相关资源
最近更新 更多