简体   繁体   中英

Does .Net support curried generics?

Suppose we have a nested generic class:

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

Here, typeof(A<int>.B<>) is in essence a generic class with two parameters where only the first is bound.

If I have a single class with two parameters

public class AB<T, U> { }

Is there a way to refer to " AB with T=int and U staying open"? If not, is this a C# limitation, or a CLR limitation?

Apparently it can't be done in C#, you have to specify either both type parameters, or none.

And it doesn't seem to be supported by the CLR either, A<int>.B<> and A<string>.B<> refer to the same type:

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

The enclosing type of both types is A<> (open generic type)

EDIT: further testing shows that typeof(A<int>.B<string>) is actually a generic type of arity 2, not a nested generic type of arity 1... typeof(A<int>.B<string>).GetGenericArguments() returns an array with typeof(int) and typeof(string) . So typeof(A<int>.B<>) would actually be equivalent to (AB)<int, > , which isn't supported (a generic type can't be partially closed)

Is this what you have in mind?

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

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

you can use the Func<int,int> generic to pass multiple parameters as a single function returning an type. Curried many to pass many arguments as a single parameter.

 [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/

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM