Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何分配函数<&燃气轮机;使用条件三元运算符?_C#_Lambda_Func - Fatal编程技术网

C# 如何分配函数<&燃气轮机;使用条件三元运算符?

C# 如何分配函数<&燃气轮机;使用条件三元运算符?,c#,lambda,func,C#,Lambda,Func,我知道,Funcs不能通过var关键字直接隐式键入,尽管我非常希望我可以对谓词进行以下赋值: Func<Something, bool> filter = (someBooleanExpressionHere) ? x => x.SomeProp < 5 : x => x.SomeProp >= 5; 我是否遗漏了什么,或者我是否需要继续使用if分支分配?var filter=(这里有一些布尔表达式) var filter = (someBool

我知道,
Func
s不能通过
var
关键字直接隐式键入,尽管我非常希望我可以对谓词进行以下赋值:

Func<Something, bool> filter = (someBooleanExpressionHere)
   ? x => x.SomeProp < 5
   : x => x.SomeProp >= 5;
我是否遗漏了什么,或者我是否需要继续使用if分支分配?

var filter=(这里有一些布尔表达式)
var filter = (someBooleanExpressionHere)
   ? new Func<Something, bool>(x => x.SomeProp < 5)
   : x => x.SomeProp >= 5;
? 新函数(x=>x.SomeProp<5) :x=>x.SomeProp>=5;
您应该将它们包装在
新函数中,否则它无法将一个lamdba转换为另一个lamdba:

 Func<Something, bool> filter = (someBooleanExpressionHere)
   ? new Func<Something, bool>(x => x.SomeProp < 5)
   : x => x.SomeProp >= 5
   ;
Func filter=(someBooleanExpressionHere)
? 新函数(x=>x.SomeProp<5)
:x=>x.SomeProp>=5
;
如果删除
新功能…
,您将获得:

无法确定条件表达式的类型,因为“lambda expression”和“lambda expression”之间没有隐式转换


您可以显式地提到类型作为编译器的提示

var filter = (condition)
    ? (Func<Something, bool>)(x => x.SomeProp < 5)
   : x => x.SomeProp >= 5;
var过滤器=(条件)
? (Func)(x=>x.SomeProp<5)
:x=>x.SomeProp>=5;

如果合适,您可以将这些选择器分配给静态字段

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

你试过在不同的地方加括号吗?e、 g.
(x=>x.SomeProp<5)
编译器可能不知道lambda变量x是什么类型。为什么不将这两个表达式放在单独的变量中,然后使用三元运算符将其中一个表达式指定给过滤器变量?@AlexMDC:Did。不起作用。第二个操作数上的括号不是严格必需的,尽管我同意它们值得添加。并不是每个人都记得所有的优先规则,所以它提高了可读性。没错,我第一次尝试使用两个
新函数,但最后一个不是必需的。谢谢你-我开始使用var-种类-奖金:)@StuartLC您可以使用
var
,但也必须明确键入类型名,因此您实际上没有
var
的好处。事实上,我认为有相当数量的人会考虑你原来的<代码>如果 /Cuth> Ethy/<代码>比这更优雅。(就我个人而言,我有分歧。我对其中一个没有真正的偏好。)是的,因此有“某种”。但至少我不必两次拼出我的lambda签名!为了进一步解释为什么需要这样做,C#中的lambda本身没有类型,lambda的类型是根据用法推断出来的。在三元条件表达式的情况下,编译器无法推断lambda类型,因为它需要知道这一点才能推断条件表达式的类型。显式实例化
Func
允许编译器计算表达式类型,并从中推断出另一个lambda的类型也是
Func
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;