2011-04-08 67 views
18

假设我们有一个嵌套的泛型类:.Net是否支持curried仿制药?

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

这里,typeof(A<int>.B<>)在本质上是与只有第一绑定两个参数的通用类。

如果我有一个类有两个参数

public class AB<T, U> { } 

有没有办法来指代“ABT=intU保持开放”?如果不是,这是C#限制还是CLR限制?

+1

这可以用F#中的类型完成吗? – GregC 2011-04-08 23:45:40

+0

如果你问我,我不知道......我从来没有真正使用F#的任何时间长度。 – configurator 2011-04-08 23:47:23

+1

“咖喱”,你的意思是“部分关闭”? – Gabe 2011-04-09 01:15:50

回答

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 

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

+4

你的观察是正确的。在封面下,C 。D 只是“C.D”。 C#构思它的方式是C .D 只是一个方便的小说。 – 2011-04-09 01:22:02

+1

@Eric,谢谢您的确认。我希望你会看到这个问题,并对其进行阐述......如果你的想法不合适,这对于一篇博客文章可能是一个很好的主题;) – 2011-04-09 01:29:57

+0

当然,你是对的。我的错误是假设'typeof(A .B <>)'是合法的 - 我知道'A .B '被实现为'AB ',这意味着'typeof(A .B <>) “实际上会是'AB ',这似乎不应该是合法的。 – configurator 2011-04-09 03:24:23

3

这是你的想法吗?

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

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

@downvoter:跟我说话。你想看到反射器输出,C#规范摘录,还有其他的东西吗? – GregC 2011-04-09 00:01:06

+2

它看起来像OP正在要求一个'Type'对象的实例,表示类似'typeof(AB )''。 – Gabe 2011-04-09 01:15:24