2017-07-07 79 views
1

我正在構建密鑰類型爲KeyValuePairDictionary。當使用KeyValuePair.CreateDictionary初始化它不需要模板類型並正確推斷的類型,下面正確編譯,甚至沒有一個警告:字典初始值設定項內的KeyValuePair類型推斷

private static readonly IDictionary<KeyValuePair<Market, MarketData>, string> channelDict = 
    new Dictionary<KeyValuePair<Market, MarketData>, string> { 
     { KeyValuePair.Create(Market.USD, MarketData.Trade), "trades" }, 
     ... 
}; 

現在代碼進行了重組,類型MarketMarketData被移到單獨的項目和命名空間,命名空間是由using語句在文件的頂部導入,但現在同樣的代碼將無法編譯,它拋出這個錯誤:

error CS0305: Using the generic type 'KeyValuePair<TKey, TValue>' requires 2 type arguments 

我可以肯定的是using名步伐正確導入,因爲簡單的添加private Market _m;沒有產生任何錯誤,更重要的是,在字典中的定義:

private static readonly IDictionary<KeyValuePair<Market, MarketData>, string> channelDict = 
    new Dictionary<KeyValuePair<Market, MarketData>, string> 

沒有產生錯誤都不是,它是Create方法不能編譯:

KeyValuePair.Create(Market.USD, MarketData.Trade) 

那麼爲什麼它不能現在推斷類型參數是否在另一個命名空間,而它可以之前?

+0

看起來你已經聲明字典是接受'IDictionary ',然後試圖創建一個實際上不同的KeyValuePair:'KeyValuePair.Create(Market.USD,MarketData.Trade)'' 。市場與Market.USD類型不同,MarketDate與MarketData類型不同。類型與MarketData.Trade – ainwood

+0

不一樣,市場是一個枚舉,Market.USD是這個枚舉的值。 – fluter

+0

考慮[Tuple](https://msdn.microsoft.com/en-us/library/system.tuple(v = vs.110).aspx)而不是'KeyValuePair'? –

回答

2

經過一番挖掘,我發現問題不在於KeyValuePair的初始化,而是因爲目標框架的差異。

最初,所有的代碼都在同一.NET核心控制檯應用程序,設定目標框架netcoreapp2.0,並從該文檔,在.NET核2.0,KeyValuePair是一個靜態類用一個靜態方法Create,這將推斷正確輸入參數。

然後,當我重新組織了代碼,我提出這部分的類庫,默認情況下,DOTNET工具將設置netstandard2.0爲目標的框架,但是,KeyValuePairCreatenetstandard2.0用,因爲你可以從docs看,它說:

This API is not supported in the currently selected framework.

這就是爲什麼代碼失敗時移動到庫項目進行編譯,只有通用KeyValuePair<K, V>版本netstandard框架。

作爲解決方法,我驗證了當我將.csproj文件中的目標框架設置爲netcoreapp2.0outputtypelibrary時,它成功地進行了編譯。

OTOH,庫項目默認使用netstandard,因爲它確保庫在不同的平臺目標中可用,所以更好的解決方法是不要在庫代碼中使用static KeyValuePair.Create,而是使用通用版本:new KeyValuePair<K, V>(k, v)

相關問題