Можете ли вы использовать троичный оператор в локальной функции C #?

c# #conditional-operator #local-functions

#c# #условный оператор #локальные функции

Вопрос:

Вот что я хотел бы реализовать:

 public static void foo()
{
    // Local function
    int? parseAppliedAmountTernary( decimal? d ) { 
        d.HasValue ? return Convert.ToInt32( Math.Round(d.Value, 0) ) : return null;
    }
    
    // The rest of foo...
}
 

Однако я получаю ошибку компиляции. Возможен ли вообще такой синтаксис? Я использую Visual Studio 2019, .NET Framework 4, который (в настоящее время) соответствует C # 7.3.

Примечание — я просто пытаюсь разобраться в синтаксисе … любая философская дискуссия относительно «удобочитаемости» кода или другой эстетики, хотя и интересная, не имеет отношения к делу. 🙂

Пример кода (использует Roslyn 4.0) https://dotnetfiddle.net/TlDY9c

Ответ №1:

Троичный оператор — это не условие, а выражение, которое принимает одно значение. Именно это значение вы должны вернуть:

 return d.HasValue ? (int?)Convert.ToInt32(Math.Round(d.Value, 0)) : null;
 

Обратите внимание, что до C # 9.0 и значение слева, и значение справа от двоеточия должны быть одного и того же типа; поэтому вам нужно привести здесь значение, отличное от null. Начиная с C # 9.0, тип может быть выведен из целевого типа.

Ответ №2:

Вы должны быть в состоянии написать это так:

 int? parseAppliedAmount(decimal? d) => d.HasValue ? Convert.ToInt32(Math.Round(d.Value, 0)) : null;