Можно ли присвоить значение обнуляемому с помощью условного оператора? - PullRequest
3 голосов
/ 14 июля 2011

Я знаю, что могу сделать это:

Int32 tempInt;
Int32? exitNum;

if (Int32.TryParse(fields[13], out tempInt))
    exitNum = tempInt;
else
    exitNum = null;

Но почему я не могу это сделать?

Int32 tempInt;
Int32? exitNum = Int32.TryParse(fields[13], out tempInt) ? tempInt : null;

Есть ли способ присвоить значение обнуляемому, используя условный оператор?

Ответы [ 4 ]

11 голосов
/ 14 июля 2011

Одна сторона условного оператора должна быть преобразована в тип другой стороны.
В вашем случае у вас есть int на одной стороне и null (выражение без типа) на другой стороне. Поскольку ни одна из сторон не совместима напрямую с другой стороной, она не работает.

Вы должны убедиться, что хотя бы одна сторона является int?, либо путем приведения, либо путем написания new int?().

Запись Int32.TryParse(fields[13], out tempInt) ? tempInt : new int?()

6 голосов
/ 14 июля 2011

Как уже отмечали другие, вы должны убедиться, что в условном операторе есть согласованный тип возврата присутствует .(Тонкая особенность C # состоит в том, что, когда мы должны создать тип для выражения среди нескольких альтернатив, выбранная альтернатива всегда будет где-то в выражении; мы никогда не "выдумываем" тип, который не появился.)

Если вас интересуют необычные факты об условном операторе, я рекомендую свои статьи на эту тему:

http://blogs.msdn.com/b/ericlippert/archive/tags/conditional+operator/

Я бы добавил, что это отличная возможностьнаписать метод расширения:

static class MyExtensions
{
    public static int? ParseInt(this string s)
    {
        int value;
        return Int32.TryParse(s, out value) ? value : (int?)null;
    }
}

И теперь вы можете просто сказать

int? exitNum = fields[13].ParseInt();

, который гораздо приятнее читать.

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

Вам просто нужно выполнить приведение к Int32? на время

Int32? exitNum = Int32.TryParse(fields[13], out tempInt) ? (int?)tempInt : null;
0 голосов
/ 14 июля 2011

Вы можете привести null к int?так что обе стороны имеют одинаковый тип:

Int32 tempInt;
Int32? exitNum = Int32.TryParse(fields[13], out tempInt) ? tempInt : (int?)null;
...