2014-09-04 6 views
3

Я знаю, что Func<> s не может быть неявно набирается непосредственно через var ключевого слова, хотя я надеялся, что я мог бы сделать следующее назначение предиката:Как назначить Func <> с помощью условного тернарного оператора?

Func<Something, bool> filter = (someBooleanExpressionHere) 
    ? x => x.SomeProp < 5 
    : x => x.SomeProp >= 5; 

Однако я получаю ошибку cannot resolve the symbol, 'SomeProp'

На данный момент я прибегнул к более громоздкому назначению if branch, которое не выглядит таким элегантным.

Func<Something, bool> filter; 
if (someBooleanExpressionHere) 
{ 
    filter = x => x.SomeProp < 5; 
} 
else 
{ 
    filter = x => x.SomeProp >= 5; 
} 

Я что-то пропустил, или мне нужно будет придерживаться назначения if-branch?

+0

Вы пытались добавить скобки в разных местах? например '(x => x.SomeProp <5)' –

+1

Компилятор, вероятно, не знает, какой тип является лямбда-переменной x. Почему бы не поместить два выражения в отдельные переменные, а затем назначить одну из них переменной фильтра, используя тернарный оператор? –

+0

@AlexMDC: Сделал. Не работает. –

ответ

7
var filter = (someBooleanExpressionHere) 
    ? new Func<Something, bool>(x => x.SomeProp < 5) 
    : x => x.SomeProp >= 5; 
+0

Спасибо, и я получаю возможность использовать var - kind of - bonus :)! – StuartLC

+1

@StuartLC Вы можете использовать 'var', но не без * также * явно указывая имя типа, поэтому на самом деле вы не пользуетесь' var'. На самом деле, я бы сказал, что есть разумное число людей, которые считают ваш оригинальный 'if' /' else' более элегантным, чем это. (Лично я разделен. У меня нет реального предпочтения для того или другого.) – hvd

+1

Yup, следовательно, «вид». Но, по крайней мере, мне не нужно указывать свою подпись лямбды * дважды *! – StuartLC

3

Вы должны обернуть их в new Func, так как иначе он не может преобразовать один lamdba другому:

Func<Something, bool> filter = (someBooleanExpressionHere) 
    ? new Func<Something, bool>(x => x.SomeProp < 5) 
    : x => x.SomeProp >= 5 
    ; 

Если удалить new Func... вы получите:

Тип условное выражение не может быть определено, потому что не существует неявного преобразования между «лямбда-выражением» и «лямбда-выражением»

+0

Скобки на втором операнде не являются строго необходимыми, хотя я согласен, что их стоит добавить. Не все запоминают все правила приоритета, поэтому улучшают читаемость. –

+0

Правда, я сначала попробовал с двумя 'новыми Func', но последнее не было необходимо. –

1

Вы можете явно указать тип как намек на компилятор

var filter = (condition) 
    ? (Func<Something, bool>)(x => x.SomeProp < 5) 
    : x => x.SomeProp >= 5; 
0

В случае необходимости, можно присвоить эти селекторы в статических полях.

private static readonly Func<Something, bool> _someFilter = x => x.SomeProp < 5; 
private static readonly Func<Something, bool> _someOtherFilter = x => x.SomeProp >= 5; 

Тогда вы можете использовать их позже.

var filter = (someBooleanExpressionHere) ? _someFilter : _someOtherFilter; 
Смежные вопросы