2017-07-07 43 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)

相关问题