2014-02-10 60 views
2

我有一個非常簡單的設計:C#能否利用隱式嵌套泛型參數?

  • 通用接口IElement<>有一個泛型參數T

    interface IElement<T> 
    { 
    } 
    
  • 管理IElement<>

ISource<>我另一個通用接口ISource<>有一個方法返回基礎類型IElement<>

T GetSomething(); 

這是我可以做的:

interface ISource<TElem, T> 
    where TElem : IElement<T> 
{ 
    T GetSomething(); 
} 

class IntegersSource : ISource<IElement<int>, int> 
{ 
    public int GetSomething() 
    { 
     return 1; 
    } 
} 

但嵌套類型,這裏int,必須重複。

我想是這樣的:

class IntegersSource : ISource<IElement<int>> 
{ 
    public int GetSomething() 
    { 
     return 1; 
    } 
} 

我已經試過:

interface ISource<TElem> 
    where TElem : IElement<T> 
{ 
    T GetSomething(); 
} 

但是,編譯器不開心與此語法。

我擔心我錯過了一些明顯的東西,但是什麼?

感謝您的任何見解。

+0

編譯器應該如何知道最後一個列表中的「T」是什麼? –

+0

你真的需要'TElem'嗎?ISource <> T'實現內部不會有'IElement '就足夠了嗎? – Dennis

+0

我根本沒有看到'IElement '接口的任何額外好處。我錯過了什麼嗎? – Alex

回答

4

這是行不通的。圖片您有以下類:

class MultiElement : IElement<int>, IElement<double> 
{ 
    // explicit interface implementations of IElement<int> and IElement<double> here. 
} 

現在,當我宣佈一個class MySource : ISource<MultiElement>,什麼應該被推斷爲T

+0

你提出了一個非常好的觀點,儘管在我的設計中這沒有任何意義。 +1 – Pragmateek

1

不幸的是,這是不可能的。我想像這樣的語法:

interface ISource<TElem<T>> 
    where TElem : IElement<T> 
{ 
    T GetSomething(); 
} 

和喜歡的相應用法:

class IntegersSource : ISource<IElement<int>> 

即使你必須明確地聲明,其中編譯器可以期待「嵌套」類型參數(參見Heinzi對特定情況的回答)。

+0

是之前發佈我已經嘗試過這種語法和其他沒有任何成功。 :/ – Pragmateek

1

你想要的格式:

class IntegersSource : ISource<IElement<int>> 
{ 
    public int GetSomething() 
    { 
     return 1; 
    } 
} 

提供了通用的參數來東森光電 - 「特萊姆」 - 爲IElement<int>

它的'int'部分隨後被埋入封閉的類型定義中。雖然可以讀取它,但編譯器並不知道IntegersSource實現中的int。

+0

我很確定C++處理這個。我認爲問題在於.Net的泛型是編譯/動態的,所以表達能力較差。 – Pragmateek