2010-10-29 4 views
4

Nous sommes en train de mettre à jour notre système craps cms et les nouveaux assemblages sont passés de int à int64. Je rencontre un problème en essayant de construire maintenant. J'ai essayé de lancer mais cela n'a pas l'air d'aider. Voici un extrait de code qui cause un problème.C# convertissant int en 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; 
    } 
} 

L'erreur est

Erreur 323 Le match de la meilleure méthode surchargée pour 'System.Collections.Generic.IDictionary.TryGetValue (int, hors string)' a des arguments invalides

Son référence à recipe.Id qui est une valeur Int64.

Des idées pour faire face à cela?

+2

Vous avez un _namespace_ appelé 'Enumeration'? – SLaks

Répondre

2

Puisque C# est fortement typé, vous ne pouvez pas convertir comme ceci. Vous devez jeter le Int64 à un Int32 avant de passer dans:

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

Vous pouvez également modifier la définition de votre dictionnaire:

IDictionary<Int64, string> aliases 
    = new UrlAliasApi().GetUrlAliasesByType(Company.DataLayer.Enumeration.UrlAliasType.Recipe) 
         .ToDictionary(kvp => (Int64)key.Key, kvp => kvp.Value); 
+0

La première solution est incorrecte. Il offre la possibilité d'un scénario de débordement pour mathc une clé incorrecte. – JaredPar

+0

J'aime ce site et les gens formidables ici. Excellente ressource pour un développeur .NET débutant. Merci codekaizen. – tking

+0

@JaredPar - D'accord, le 2ème est plus sûr. – codekaizen

1

Vous devez jeter le Int64 à un int, comme ceci:

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

Dans un scénario de débordement, le champ 'Id' pourrait être arrondi à une valeur différente et produire un faux positif. – JaredPar

0

Pourquoi ne pas pouvez-vous utiliser juste Dictionary<Int64, string> au lieu de Dictionary<int, string>?

1

Le problème ici est que vous essayez d'utiliser une valeur Int64 dans un emplacement qui prend un type int/Int32. Il n'y a pas de conversion implicite ici et donc les erreurs du compilateur. La meilleure façon de résoudre ce problème est de convertir le dictionnaire aliases pour utiliser également un type Int64. Il est toujours sûr de convertir un int en Int64 afin qu'il n'y ait aucune perte d'information dans cette conversion.

Idéalement, vous devez convertir GetUrlAliasesByType pour retourner un IDictionary<Int64,string>. Le reste du système utilise maintenant Int64 donc cette conversion est logique. Sinon, vous pouvez faire la

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

suite à la vérification opération ici est nécessaire, car elle empêche un débordement silencieux de produire une fausse correspondance avec TryGetValue

1

Notez que si vous pouvez lancer Int64 à Int32 (ou int), vous pourriez perdre des données si les valeurs que vous lancez sont plus grandes que ce qui peut être représenté dans un Int32. Dans votre cas, cela n'a peut-être pas d'importance, mais j'ai pensé que je devrais le mentionner.