.Net是否支持咖喱仿制药?

时间:2011-04-08 23:33:08

标签: c# .net generics currying

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

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

在这里,typeof(A<int>.B<>)本质上是一个具有两个参数的泛型类,其中只有第一个被绑定。

如果我有一个包含两个参数的单词

public class AB<T, U> { }

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

2 个答案:

答案 0 :(得分:10)

显然无法在C#中完成,你必须同时指定两个类型参数,或者不指定。

CLR似乎也不支持它,A<int>.B<>A<string>.B<>引用相同的类型:

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

两种类型的封闭类型是A<>(开放泛型类型)

编辑:进一步测试显示typeof(A<int>.B<string>)实际上是一个通用类型的arity 2,不是嵌套泛型类型的arity 1 ... typeof(A<int>.B<string>).GetGenericArguments()返回一个数组typeof(int) typeof(string)。所以typeof(A<int>.B<>)实际上等同于(A.B)<int, >,不支持(通用类型不能部分关闭)

答案 1 :(得分:3)

这是你的想法吗?

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

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