.Net支持curried泛型吗?

9udxz4iz  于 2022-11-19  发布在  .NET
关注(0)|答案(3)|浏览(101)

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

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

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

public class AB<T, U> { }

是否有方法引用“ABT=intU保持打开”?如果没有,这是C#限制还是CLR限制?

kyks70gy

kyks70gy1#

显然,这在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, >,这是不支持的(泛型类型不能部分封闭)

q5lcpyga

q5lcpyga2#

这就是你想要的吗?

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

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

6tr1vspr3#

你可以使用Func〈int,int〉泛型将多个参数作为一个返回类型的函数传递。2 Curried many将多个参数作为一个参数传递。

[Fact]
    public async Task TestCurried()
    {
        Func<int, Func<int, int>> curried = x => y => x + y;
        int sum = curried(1)(3);
        Assert.Equal(sum.ToString(), "4");
    }
see
https://blog.tchatzigiannakis.com/generics-as-super-functions/

相关问题