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

con*_*tor 18 .net c# generics currying

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

public class A<T> {
    public class B<U> { }
}
Run Code Online (Sandbox Code Playgroud)

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

如果我有一个带有两个参数的单个类

public class AB<T, U> { }
Run Code Online (Sandbox Code Playgroud)

有没有办法提到" ABT=intU保持开放"?如果不是,这是C#限制还是CLR限制?

Tho*_*que 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
Run Code Online (Sandbox Code Playgroud)

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

  • 你的观察是正确的.在封面下,C <.T> .D <U>只是"CD"<T,U>.将C#构思为C <T> .D <U>的方式只是一个方便的小说. (4认同)