Почему эта строка не работает user.Age = (result [11] == string.Empty)?(int?) null: Int32.Parse (результат [11]) - PullRequest
0 голосов
/ 01 июля 2011

Допустим result[11] == string.Empty (т.е. result[11] = "")

if (result[11] == string.Empty) // this block works fine
{
    user.Age = Int32.Parse(result[11]);
}
else
{
    user.Age = null;
}

// the following line will throw exception
user.Age = (result[11] == string.Empty) ? (int?) null : 
                                          Int32.Parse(result[11]);

System.FormatException не обработан Сообщение = Входная строка была в неправильном формате. Источник = mscorlib Трассировки стека: в System.Number.StringToNumber (String str, NumberStyles, NumberBuffer & number, >> >> Информация NumberFormatInfo, логическое parseDecimal) в System.Number.ParseInt32 (String s, стиль NumberStyles, информация NumberFormatInfo) at System.Int32.Parse (String s)

Для меня два вышеупомянутых блока одинаковы. Тогда почему первый работает, а второй нет?

Ответы [ 5 ]

7 голосов
/ 01 июля 2011

Блоки не совпадают.

if (result[11] == string.Empty) // this block works fine
{
    user.Age = Int32.Parse(result[11]);
}

Этот блок на самом деле не должен работать, потому что блок будет анализировать только пустую строку.Поменяйте код в блоке "if" и блоке "else", и он будет идентичен вашему троичному оператору "?:".

1 голос
/ 01 июля 2011

Каждый ответил, что вы пытаетесь разобрать неверные строки как целые.Они правы.Однако, очевидно, люди упустили, что ваш код не эквивалентен, потому что вы перевернули троичные предложения.Это будет ваш эквивалентный код:

//if this is your code:
if (result[11] == string.Empty) // this block works fine
{
    user.Age = Int32.Parse(result[11]);
}
else
{
    user.Age = null;
}

//This is your equivalent ternary. You have inverted here
user.Age = (result[11] == string.Empty) ? Int32.Parse(result[11]) : 
                                          null;
1 голос
/ 01 июля 2011

Я пробовал это:

        var value = "";
        int? age;

        if (value != string.Empty)
        {
            age = Int32.Parse(value);
        }
        else
        {
            age = null;
        }


        age = (value == string.Empty) ? (int?)null : Int32.Parse(value);

, и он отлично работает (я изменил == на != в первом if).

1 голос
/ 01 июля 2011

Результат, который вы пытаетесь проанализировать как Integer, не является допустимым Integer, поэтому имеются исключения.Скорее сделайте следующее.

if (!String.IsNullOrEmpty(result[11]))
{
    if (!Int32.TryParse(result[11], out user.Age))
        user.Age = null; // not really needed
}
0 голосов
/ 01 июля 2011

результат [i] может вернуть 'объект', следовательно, приведение:

     (string) result[i] == ....
     Int.Parse(  (string) result[i] )
...