2011-04-08 88 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