假设我们有一个嵌套的泛型类:
public class A<T> { public class B<U> { } }
这里,typeof(A<int>.B<>)本质上是一个泛型类,它有两个参数,其中只有第一个参数是绑定的。如果我有一个带两个参数的类
typeof(A<int>.B<>)
public class AB<T, U> { }
是否有方法引用“AB,T=int和U保持打开”?如果没有,这是C#限制还是CLR限制?
AB
T=int
U
kyks70gy1#
显然,这在C#中无法实现,您必须指定两个类型参数,或者一个都不指定。而且CLR似乎也不支持它,A<int>.B<>和A<string>.B<>引用相同的类型:
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, >,这是不支持的(泛型类型不能部分封闭)
A<>
typeof(A<int>.B<string>)
typeof(A<int>.B<string>).GetGenericArguments()
typeof(int)
typeof(string)
(A.B)<int, >
q5lcpyga2#
这就是你想要的吗?
class AB<T, U> { protected T t; U u; } class C<U> : AB<int, U> { public void Foo() { t = 5; } }
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/
3条答案
按热度按时间kyks70gy1#
显然,这在C#中无法实现,您必须指定两个类型参数,或者一个都不指定。
而且CLR似乎也不支持它,
A<int>.B<>
和A<string>.B<>
引用相同的类型:两个型别的封入型别都是
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, >
,这是不支持的(泛型类型不能部分封闭)q5lcpyga2#
这就是你想要的吗?
6tr1vspr3#
你可以使用Func〈int,int〉泛型将多个参数作为一个返回类型的函数传递。2 Curried many将多个参数作为一个参数传递。