2014-01-15 74 views
1

未使用泛型參數的泛型類我想要做以下幾點:在構造

public class My<T> 
{ 
    public My(G<S> g, T t) 
    { 
     // code that DOES NOT use S in any way 
    } 
} 

我得到「無法解析符號S」。 是否有可能以某種方式做到這一點?如果不是,爲什麼? 我不能改變G,這不是我的課。

回答

1

不同於構件的功能,構造函數不能在指定的通用類型的他們的聲明。要解決此,您需要解除泛型類型從構造和入類聲明:

public class My<T,S> 
{ 
    public My(G<S> g, T t) 
    { 
     // code that DOES NOT use S in any way 
    } 
} 

如果你打算有采取額外的泛型類型不同的構造函數,這可能是一個問題。

0

只是聲明小號明確在你的方法:

public class My<T, S> 
{ 
    public My(G<S> g, T t) 
    { 
     // code that DOES NOT use S in any way 
    } 
} 

這將編譯(除非你有G類別S上一些條件)。在使用我的課程時,您將不得不在任何情況下聲明S是什麼。

例子ģ< S> =可空< S>:

public class My<T, S> where S : struct 
{ 
    public My(Nullable<S> g, T t) 
    { 
     // code that DOES NOT use S in any way 
    } 
} 

利用該實現方式中,必須定義S使用的我的類(在這種情況下,S爲INT)時:

var myVar = new My<string, int>(4, string.Empty); 
+0

似乎並不與構造工作。 我錯過了什麼嗎? – lonelyass

+0

是的,我修好了 – AlexH

1

您需要:

  1. 刪除了<S>或的需要(即。用非一般類型,接口等)
  2. 取代它,或作爲一種通用的參數添加S到該類型:

    public class My<T, S> 
    { 
        public My(G<S> g, T t) 
        { 
         // code that DOES NOT use S in any way 
        } 
    } 
    
+0

謝謝。 我不需要S.但是G型不是協變型的,所以我不能接受像G 那樣的水貨。 你是否知道爲什麼解決這個問題是不可能的或者它只是C#的技術限制? – lonelyass

+0

編譯器需要知道'S'是什麼。如果'S'是與參考類型相比的值類型,則代碼將會不同,甚至對於不同的值類型也是不同的。 –

0

用戶實現如下:

public class My<T, S> 
{ 
    public My(G<S> g, T t) 
    { 
    // Now S will be accessible. 
    } 
}