2010-10-25 79 views
0

打破MS RBTree(內部的.Net抽象類),我發現一個方法返回TreePage<K>返回MyNestedClass <K>當MyNestedClass不是MyNestedClass <K>?

private TreePage<K> AllocPage(int size) 
{ 
    ... 
} 

在這個方法中,變量聲明爲TreePage ...但沒有定義的類這種方式:

private sealed class TreePage 
{ 
    ... 
} 

然而,當我模仿使用。NET 2010(Express)中的代碼和定義,我不能做到這一點:

Error: The non-generic type 'RBTree.TreePage' cannot be used with type arguments

那麼,有沒有我找不到的擴展方法? MS正在做什麼,我們只是不明白?

回答

4

在聲明嵌套在一個泛型類

class Foo<T> 
{ 
    class Bar 
    { 
    } 
} 

一類這個被編譯成類

Foo<T> 

和一類

Foo+Bar<T> 

酒吧是通用的,因爲它嵌套在泛型類Foo中。但是在C#中不重複類型參數聲明(您將該類引用爲Foo <T> .Bar)。

我注意到Reflector顯示嵌套在泛型類中的泛型類型參數,即使它們沒有直接聲明任何類型參數。這是一個錯誤。直接將其複製到Reflector時,您需要修復代碼。

+0

因此,反射器顯示我TreePage ...你說的是,那麼,我應該刪除任何通用類型的參數,它應該沒問題? – IAbstract 2010-10-25 00:19:47

+0

我不確定我是否明白這是如何解決OP的問題呢? (我認爲Logan釘了它。) – 2010-10-25 00:19:58

+0

@dboarman:如果你從Reflector得到你的代碼,並且沒有找到通用的TreePage,那麼,是的,你已經弄錯了一個bug,你需要刪除。 – dtb 2010-10-25 00:24:26

0

它實際上比你想像的要複雜。 KlassKlass<T>是兩種完全不同的類型。如此:

class A 
    { 
    } 

    class A<T> 
    {} 

    class Program 
    { 
    static public void Main(string[] args) 
    { 
     A a = new A(); 
     A<int> generic_a = new A<int>(); 
    } 
    } 

還有另一個TreePage<T>漂浮在那裏。

+0

+1,這經常令人驚訝。 – 2010-10-25 00:17:16

+1

但是,反射器沒有看到2個類。當我搜索「TreePage」時,它會以「TreePage 」作爲響應。當我選擇反彙編這個課程時,其定義與我在我的問題中所展示的完全相同。 – IAbstract 2010-10-25 00:23:00

+0

@dboarman我不知道你在使用反射器(你沒有在你的問題中提到過),我假設你正在看源代碼。正如dtb所述,反射器確實存在缺陷。 – 2010-10-25 00:43:29

相關問題