4

安っぽい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値です。

これに対処するためのアイデアはありますか?

4

5 に答える 5

2

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);
于 2010-10-29T19:53:41.970 に答える
1

次のようInt64に、をにキャストする必要があります。int

aliases.TryGetValue((int)recipe.Id, out alias)
于 2010-10-29T19:53:51.280 に答える
1

ここでの問題は、型Int64をとる場所で値を使用しようとしていることです。int/Int32ここには暗黙の変換がないため、コンパイラエラーが発生します。

これを修正する最良の方法は、タイプもaliases使用するように辞書を変換することです。に変換することInt64は常に安全であるため、この変換で情報が失われることはありません。 intInt64

理想的には、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

于 2010-10-29T19:55:36.353 に答える
1

Int64をInt32(またはint)にキャストすることはできますが、キャストする値がInt32で表現できる値よりも大きい場合、一部のデータが失われる可能性があることに注意してください。あなたの場合、それは問題ではないかもしれませんが、私はそれについて言及する必要があると思いました。

于 2010-10-29T19:57:30.327 に答える
0

Dictionary<Int64, string>なぜ代わりに使用できないのですDictionary<int, string>か?

于 2010-10-29T19:54:58.297 に答える