C # преобразование int в Int64 - PullRequest
       8

C # преобразование int в Int64

4 голосов
/ 29 октября 2010

мы находимся в процессе обновления нашей дрянной системы 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 ]

2 голосов
/ 29 октября 2010

Поскольку 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);
1 голос
/ 29 октября 2010

Обратите внимание, что хотя вы можете приводить Int64 к Int32 (или int), вы можете потерять некоторые данные, если значения, которые вы приводите, больше, чем могут быть представлены в Int32. В вашем случае это может не иметь значения, но я подумал, что должен упомянуть об этом.

1 голос
/ 29 октября 2010

Проблема здесь в том, что вы пытаетесь использовать значение 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

1 голос
/ 29 октября 2010

Вам необходимо привести Int64 к int, например:

aliases.TryGetValue((int)recipe.Id, out alias)
0 голосов
/ 29 октября 2010

Почему вы не можете просто использовать Dictionary<Int64, string> вместо Dictionary<int, string>?

...