Как писать строго типизированные лямбда-выражения?

StackOverflow https://stackoverflow.com/questions/1076700

  •  21-08-2019
  •  | 
  •  

Вопрос

Я хочу написать лямбда-выражение внутри встроенного оператора if.Но встроенный оператор if должен иметь результаты строгого типа.

MyType obj = someObj.IsOk ? null : () => {
   MyType o = new MyType(intVal);
   o.PropertyName = false;
   return o;
};

Конечно, это не работает, поскольку лямбда-выражение не является строго типизированным.Я думал об использовании Func<intVal, MyType> делегировать, чтобы сделать его сильным типом.

Но как мне это использовать Func<> внутри встроенного, если?Возможно ли вообще, что мне придется определить свою собственную функцию снаружи и использовать ее во встроенном операторе if?

Это было полезно?

Решение

Даже в более сложном коде вы можете использовать выражение инициализатора объекта:

MyType obj = someObj.IsOk ? null : new MyType(intVal) { ProName = false };

Если вы Действительно хотите использовать лямбду, вы можете написать:

MyType obj = someObj.IsOk ? null : ((Func<MyType>) (() => {
   MyType o = new MyType(intVal);
   o.ProName = false;
   return o;
}))();

Однако это, откровенно говоря, кошмар брекетов и гипсовых повязок.Вы можете упростить задачу с помощью вспомогательного метода:

public T Execute(Func<T> func)
{
    return func();
}

...

MyType obj = someObj.IsOk ? null : Execute(() => {
   MyType o = new MyType(intVal);
   o.ProName = false;
   return o;
});

Другие советы

Это не имеет никакого отношения к типизации лямбды здесь.Вы пытаетесь вернуть либо null или (функция не принимает аргументов и возвращает MyType), но вы сообщаете компилятору, что результатом этого оператора является не функция, а просто MyType.Я думаю, что ты хочешь сделать это

MyType obj = someObj.IsOk ? null : new MyType(intVal);

Если у вас есть что-то подобное...

  var obj = (someObj.IsOK) ? null : () => {
             return new MyType(intVal) { PropName =false }; }

Вы получите ошибку...

«Нет явного преобразования между выражением NULL и Lambda».

Причина этого обсуждается в этом ТАК поток.

Марк прав в том, что вы пытаетесь сделать с примером кода, за исключением того, что вы можете установить свойство так же, как здесь...

var obj = someObj.IsOk ? null : new MyType(intVal) { PropName = false };
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top