2015-02-23 136 views
0

我想構建一個泛型類型,它將在初始化類型T1的實例並在其方法中接受類型T2的實例時接受。

所以,現在我有一個通用的方法,在可接受的類型有一個約定 - 是某種抽象類的孩子,我有這個抽象類型實例的內部集合:
瞭解使用泛型方法/類型時的類型分配

private readonly IList<Tuple<CommandBase<SocialNetworkUnit, SocialNetworkUnit>, SocialNetworkUnit>> _history; 

public bool Invoke<TInitiator, TParameter>(CommandBase<TInitiator, TParameter> command, TParameter parameter) 
    where TInitiator : SocialNetworkUnit 
    where TParameter : SocialNetworkUnit 
{ 
    var success = command.Run(parameter); 
    this._history.Add(new Tuple<CommandBase<SocialNetworkUnit, SocialNetworkUnit>, SocialNetworkUnit>(command, parameter)); 
} 

但是我有一個編譯錯誤說TInitiator和TParameter參數(傳統給SocialNetworkUnit)不能用於收集。

Argument 1: cannot convert from 'CommandUnits.CommandBase<TInitiator,TParameter>' to 'CommandUnits.CommandBase<Command.SNUnit.SocialNetworkUnit,Command.SNUnit.SocialNetworkUnit>' 

你能告訴我我的錯誤嗎?

感謝

回答

-1

嘗試進行明確的轉換:

this._history.Add(new Tuple<CommandBase<SocialNetworkUnit, SocialNetworkUnit>, SocialNetworkUnit>(command as CommandBase<SocialNetworkUnit, SocialNetworkUnit>, parameter)); 
+0

這隻會使它在運行時失敗。 (或者簡單地說它總是'空',因爲你錯誤地使用了'as'。) – Servy 2015-02-23 21:42:59

0

CommandBase沒有關於這兩個通用的參數不變性。它需要協同才能工作,而在C#中,類不能協變,只有接口可以。如果您創建了一個具有這兩個泛型參數的接口作爲協變,並使用該接口而不是您擁有的列表中的CommandBase,那麼代碼將可以工作。