Как писать строго типизированные лямбда-выражения?
Вопрос
Я хочу написать лямбда-выражение внутри встроенного оператора 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 };