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;