2010-10-01 45 views
1

這可能是不可能的,但我要檢查,如果這樣的事情可以以簡單的方式來表達:現在(Re)的使用約束類型的泛型參數沒有聲明

// obviously doesn't work 
class Foo<T> : IFoo<T1,T2> 
    where T: Bar<T1,T2> 
{ 
    // ... 
    Baz<T1,T2> getBaz(){...} 
} 

我聲明Foo<T1,T2>,但我不喜歡它的語義,並且獲得約束的唯一方法是也列出Foo的通用參數列表中的Bar,我期望減少冗餘,而不是添加到它。

編輯:Baz<T1,T2>應該是返回類型,而不是方法名

回答

1

您可以創建它周圍的包裝類,但我懷疑這是不是你原來更好的解決方案:

public class FooWrapper<T1, T2> 
    { 
    public Foo<Bar<T1, T2>> FooObj; 

    public FooWrapper() 
    { 
     FooObj = new Foo<Bar<T1, T2>>(); 
    } 

    public class Foo<T> : IFoo<T1, T2> where T : Bar<T1, T2> 
    { 
     // ... 
     public void Baz() 
     { 
      Type t1 = typeof(T1); 
      Type t2 = typeof(T2); 
     } 
    } 
    } 
+0

謝謝你一個富有想象力的解決方案.....我會重構'FooWrapper '構造函數到靜態方法,但基本上它:) – alh84001 2010-10-01 12:12:31

4

這裏的問題是,它並沒有定義什麼T1和T2。

你可以這樣做:

class Foo<T> : IFoo<int,string> 
    where T: Bar<int,string> 
{ 
    // ... 
    void Baz(){...} 
    // can call e.g. Qux<int, string>(); 
} 

而且你可以這樣做:

class Foo<T, T1, T2> : IFoo<T1,T2> 
    where T: Bar<T1,T2> 
{ 
    // ... 
    void Baz(){...} 
    // can call e.g. Qux<T1, T2>(); 
} 

但因爲它是,有沒有知道什麼T1和T2的方式(人甚至無法猜測在你要做什麼,所以編譯器無法推斷出它)。

+0

這就是我想..... T1和T2能被隱式包含,但我想這只是一個矯枉過正......但是,謝謝 – alh84001 2010-10-01 12:18:14

+0

隱含在哪裏? – 2010-10-01 12:56:58

1

創建對於給定的通用方式的運行時類型所需要的類型參數必須在與通用的類名的尖括號中聲明:

class Foo<T, T1, T2> : IFoo<T1, T2> 
      where T: Bar<T1, T2> 
{ 
    //... 
    void Baz() {...} 
} 

基本上,由於Foo<x,y,z>爲x的任何給定的組合獨特, y和z,它們都必須被聲明爲「最高」。

請注意,您不需要用Baz聲明'T1,T2',但是 - 這些類型參數已經爲該類定義。你可以找到更多的ECMA spec for generics

+0

謝謝.....我在寫問題時混合了返回類型和方法名稱,但它並沒有顯着改變意義,雖然 – alh84001 2010-10-01 12:16:17