我们正在升级我们糟糕的cms系统,新程序集已从int更改为int64。我现在正在尝试构建时遇到问题。我尝试过铸造,但它似乎没什么帮助。这是导致问题的一段代码摘录。
IDictionary<int, string> aliases
= new UrlAliasApi().GetUrlAliasesByType(
Company.DataLayer.Enumeration.UrlAliasType.Recipe);
foreach (ContentBase recipe in mergedResultset)
{
// if alias exists, overwrite quicklink!
string alias;
if (aliases.TryGetValue(recipe.Id, out alias))
{
recipe.QuickLink = alias;
}
}
错误是
错误323'System.Collections.Generic.IDictionary.TryGetValue(int,out string)'的最佳重载方法匹配有一些无效的参数
它指的是recipe.Id
Int64
值。
有任何处理这个问题的想法吗?
答案 0 :(得分:2)
由于C#是强类型的,因此无法像这样进行转换。在传递Int64之前,需要将Int64转换为Int32:
aliases.TryGetValue((int)recipe.Id, out alias)
或者,您可以更改字典的定义:
IDictionary<Int64, string> aliases
= new UrlAliasApi().GetUrlAliasesByType(Company.DataLayer.Enumeration.UrlAliasType.Recipe)
.ToDictionary(kvp => (Int64)key.Key, kvp => kvp.Value);
答案 1 :(得分:1)
您需要将Int64
转换为int
,如下所示:
aliases.TryGetValue((int)recipe.Id, out alias)
答案 2 :(得分:1)
此处的问题是您尝试在采用Int64
类型的地方使用int/Int32
值。这里没有隐式转换,因此编译器错误。
解决此问题的最佳方法是将aliases
字典转换为使用Int64
类型。将int
转换为Int64
始终是安全的,因此此转换中不会丢失任何信息。
理想情况下,您需要将GetUrlAliasesByType
转换为IDictionary<Int64,string>
。系统的其余部分现在使用Int64
,因此这种转换很有意义。否则你可以执行以下操作
string alias;
try {
if (aliases.TryGetValue(checked((int)recipe.Id), out alias))
{
recipe.QuickLink = alias;
}
} catch (OverflowException) {
// id not valid
}
此处检查的操作是必要的,因为它可以防止静默溢出与TryGetValue
产生错误匹配
答案 3 :(得分:1)
请注意,虽然可以将Int64转换为Int32(或int),但如果要转换的值大于可以在Int32中表示的值,则可能会丢失一些数据。在你的情况下它可能没关系,但我想我应该提到它。
答案 4 :(得分:0)
为什么不能只使用Dictionary<Int64, string>
代替Dictionary<int, string>
?