【问题标题】:C# converting int to Int64C# 将 int 转换为 Int64
【发布时间】:2011-05-02 14:34:52
【问题描述】:

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

有什么办法解决这个问题吗?

【问题讨论】:

  • 你有一个名为Enumeration命名空间

标签: c# asp.net casting ektron


【解决方案1】:

由于 C# 是强类型的,所以不能这样转换。在传入之前,您需要将 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);

【讨论】:

  • 第一个解决方案不正确。它提供了计算错误键的溢出场景的可能性。
  • 我喜欢这个网站和这里的伟大人物。非常适合初学者 .NET 开发人员的资源。谢谢 codekaizen。
  • @JaredPar - 同意,第二个更安全。
【解决方案2】:

您需要将Int64 转换为int,如下所示:

aliases.TryGetValue((int)recipe.Id, out alias)

【讨论】:

  • 在溢出情况下,Id 字段可能会向下舍入为不同的有效值并产生误报。
【解决方案3】:

为什么不能只使用Dictionary&lt;Int64, string&gt; 而不是Dictionary&lt;int, string&gt;

【讨论】:

    【解决方案4】:

    这里的问题是您试图在采用int/Int32 类型的地方使用Int64 值。这里没有隐式转换,因此编译器错误。

    解决此问题的最佳方法是将aliases 字典转换为也使用Int64 类型。将int 转换为Int64 始终是安全的,因此在此转换中不会丢失信息。

    理想情况下,您应该将GetUrlAliasesByType 转换为IDictionary&lt;Int64,string&gt;。系统的其余部分现在使用Int64,所以这种转换是有意义的。否则,您可以执行以下操作

    string alias; 
    try { 
      if (aliases.TryGetValue(checked((int)recipe.Id), out alias)) 
      { 
        recipe.QuickLink = alias; 
      } 
    } catch (OverflowException) { 
      // id not valid
    }
    

    这里的检查操作是必要的,因为它可以防止静默溢出产生与TryGetValue的错误匹配

    【讨论】:

      【解决方案5】:

      请注意,虽然您可以将 Int64 转换为 Int32(或 int),但如果您转换的值大于 Int32 中可以表示的值,则可能会丢失一些数据。在你的情况下,这可能无关紧要,但我认为我应该提及它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-09
        • 2018-07-04
        • 1970-01-01
        • 2013-02-04
        • 1970-01-01
        • 2016-07-06
        相关资源
        最近更新 更多