Подтвердить что ты не робот

Терминальный оператор с одним вызовом

.NET теперь поддерживает оператор null coalescing

var item = aVal ?? aDefaultVal; 

Я мог бы игнорировать что-то очевидное, но есть ли что-то подобное для тернарного оператора, так что вместо того, чтобы делать

var item = aclass.amethod() > 5 ? aclass.amethod() : 5; 

не нужно было бы дважды называть amethod()?

4b9b3361

Ответ 1

В С# нет такого оператора, встроенного в С#.

Пока я выбираю один из других ответов (тот, который использует Math.Max, возможно, более понятен для опубликованного примера), здесь здесь просто показан другой метод. Стыдно, что для вычисления требуется явно типизированная переменная.

Func<int,int> computation = (x) => x > 5 ? x : 5;
var item = computation(aclass.amethod());

И в строке, которая просто уродлива на С#.

var item = ((Func<int,int>)((x) => x > 5 ? x : 5))(aclass.amethod());

Конечно, оба из них действительно сводятся к следующему:

var item = DoComputation(aclass.amethod());

И используйте тот факт, что С# не использует pass-by-name: -)

Или, возможно, метод расширения:

static class Ext {
  public static TO Apply<TI,TO> (this TI obj, Func<TI,TO> fn) {
    return fn(obj);
  }
}

// note C# now lets us get away with no explicit Func<...> type
var item = Ext.Apply(aclass.amethod(), x => x > 5 ? x : 5);

// or as extension method -- imagine computation is as it was in the
// first example, or a compatible method group
var item = aclass.amethod().Apply(computation);

Счастливое кодирование.

Ответ 2

var item = Math.Max(5, aclass.amethod());

Ответ 3

Как насчет:

var result = aclass.amethod();
var item = result > 5 ? result : 5;

Вам нужно только позвонить aclass.amethod() один раз, затем.