2011-08-31 181 views
6

我想在單元測試項目中編寫一個輔助方法,它將初始化演示者將視圖實例設置爲它並設置演示者狀態。類型參數不能與類型參數一起使用

它把我的例外:

類型參數不能與類型參數一起使用

代碼:

public static **TPresenter<TView>** Initialize<TPresenter,TView>() 
    where TPresenter: BasePresenter<TView>, new() 
    where TView : new() 
{ 
} 

後幾分鐘,我發現這個問題是與我的退貨類型TPresenter<Tview>

我讀了幾篇沒有明確解釋的帖子爲什麼我不能說T1<T2>

我不得不通過參考參數做主講人分配。任何解釋都是值得歡迎的!

+3

爲什麼不只是返回'TPresenter'?它已經被限制爲一種強制專精於'TView'的類型(通過'BasePresenter <>')。 –

+0

是絕對希望避免在來電方播放!假設我可以實現T1 !雖然我可以用Presenter返回類型初步沒有確信爲什麼T1 與所有的條件提到不能幫助編譯時間驗證。 – ioWint

回答

9

基本上沒有說一個類型參數是本身一個泛型類型的類型參數的特定數量的方式 - 你需要能夠爲了使TPresenter<TView>有意義的事情。

目前還不清楚你的意思是通過引用參數來工作 - 無論你用於ref參數的類型是否應該都可以作爲返回類型。我的猜測是它只是TPresenter而不是TPresenter<TView>

+0

是的,它是出了TPresenter – ioWint

+0

@ioWint:對,所以只是讓返回類型。 –

+1

是的,我可以,只是想避免在來電方明確演員。從來沒有打擾到目前爲止T1 ,理論上希望如果所有的條件都給予它應該是好的! – ioWint

1

有沒有這樣的事情作爲TPresenter<TView>它是沒有意義的。 TPresenter只是一個佔位符,直到它受到它可能是任何東西的限制,例如沒有int<tview>,所以你不能這樣做。一旦添加約束條件,它意味着它必須是BasePresenter<TView>或某種派生類型,因此它總是Something<TView>,因此再次TPresenter<TView>是沒有意義的。

+0

我得知我可能會誤導int 但我確實指出了我的限制,即TPresenter是BasePresenter的,而TInterface是class。這將不足以確保在編譯時間情況良好嗎? – ioWint

+1

問題的關鍵在於TPresenter必須是BasePresenter 或從它派生的東西,因此您的返回類型只是TPresenter –

0

這是一箇舊的,但我也打了。在類定義中,只使用單一類型,然後使用多種類型。例如:

public class Template1<T>{} 

void SomeFunc() 
{ 
    <Template1<SomeClass1,SomeClass2>> someValue = new <Template1<SomeClass1,SomeClass2>>() 
} 

//or even: 
void SomeOtherFunc<U,V>() 
{ 
    <Template1<U,V>> someValue = new <Template1<U,V>>(); 
} 
0

我的代碼中出現類似的錯誤。 @Jon Skeet正確指向正確的方向。返回類型已經是通用的,如TPresenter : BasePresenter<TView>所指定的那樣。所以我們可以簡單地使用它作爲TPresenter而不是TPresenter<TView>

public class BasePresenter<T> 
{ 

} 

public class Demo 
{ 
    public static TPresenter Initialize<TPresenter, TView>() where TPresenter: BasePresenter<TView>, new() 
    { 
     return null; 
    } 
} 
相關問題