C#将int转换为Int64

时间:2010-10-29 19:50:21

标签: c# asp.net casting ektron

我们正在升级我们糟糕的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值。

有任何处理这个问题的想法吗?

5 个答案:

答案 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>