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 singl开发者_开发知识库e 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 (A.B)<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/
精彩评论