假设我们有一个嵌套的泛型类:.Net是否支持curried仿制药?
public class A<T> {
public class B<U> { }
}
这里,typeof(A<int>.B<>)
在本质上是与只有第一绑定两个参数的通用类。
如果我有一个类有两个参数
public class AB<T, U> { }
有没有办法来指代“AB
与T=int
和U
保持开放”?如果不是,这是C#限制还是CLR限制?
假设我们有一个嵌套的泛型类:.Net是否支持curried仿制药?
public class A<T> {
public class B<U> { }
}
这里,typeof(A<int>.B<>)
在本质上是与只有第一绑定两个参数的通用类。
如果我有一个类有两个参数
public class AB<T, U> { }
有没有办法来指代“AB
与T=int
和U
保持开放”?如果不是,这是C#限制还是CLR限制?
显然它不能在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,不是一个nested通用类型的arity 1 ... typeof(A<int>.B<string>).GetGenericArguments()
返回一个数组与typeof(int)
和typeof(string)
。所以typeof(A<int>.B<>)
实际上相当于(A.B)<int, >
,这是不支持的(通用类型不能部分关闭)
你的观察是正确的。在封面下,C
@Eric,谢谢您的确认。我希望你会看到这个问题,并对其进行阐述......如果你的想法不合适,这对于一篇博客文章可能是一个很好的主题;) – 2011-04-09 01:29:57
当然,你是对的。我的错误是假设'typeof(A
这可以用F#中的类型完成吗? – GregC 2011-04-08 23:45:40
如果你问我,我不知道......我从来没有真正使用F#的任何时间长度。 – configurator 2011-04-08 23:47:23
“咖喱”,你的意思是“部分关闭”? – Gabe 2011-04-09 01:15:50