C# 此条件表达式的语法
在if-else语句(c#)中有以下代码 但是,我更愿意使用这样的条件表达式:C# 此条件表达式的语法,c#,asp.net,C#,Asp.net,在if-else语句(c#)中有以下代码 但是,我更愿意使用这样的条件表达式: var r = !string.IsNullOrEmpty(ParentKey) ? 100 : 1000; Func<SiloNode, bool> predicate = !string.IsNullOrEmpty(ParentKey) ? x => x.ParentKey == ParentKey : x => x
var r = !string.IsNullOrEmpty(ParentKey)
? 100
: 1000;
Func<SiloNode, bool> predicate = !string.IsNullOrEmpty(ParentKey)
? x => x.ParentKey == ParentKey
: x => x.Url == Request.Url.GetLeftPart(UriPartial.Path);
通常情况下,这不会是一个问题,但var是一个Func
,表示表达式如下所示:
var r = !string.IsNullOrEmpty(ParentKey)
? 100
: 1000;
Func<SiloNode, bool> predicate = !string.IsNullOrEmpty(ParentKey)
? x => x.ParentKey == ParentKey
: x => x.Url == Request.Url.GetLeftPart(UriPartial.Path);
Func谓词=!string.IsNullOrEmpty(ParentKey)
? x=>x.ParentKey==ParentKey
:x=>x.Url==Request.Url.GetLeftPart(UriPartial.Path);
毫不奇怪,上面的代码给了我一个语法错误,但我不确定这是因为我使用了错误的语法还是根本不可能
有人对此有任何了解吗?一个lambda只是一个lambda,您的两个lambda不一定对应于
Func
对象(即使签名匹配)
实际上,您可以将这些lambda中的一个(或两个)强制转换为相应的Func
类型,然后?:
操作符将起作用
Func<SiloNode, bool> predicate = !string.IsNullOrEmpty(ParentKey)
? (Func<SiloNode, bool>)(x => x.ParentKey == ParentKey)
: x => x.Url == Request.Url.GetLeftPart(UriPartial.Path);
Func谓词=!string.IsNullOrEmpty(ParentKey)
? (Func)(x=>x.ParentKey==ParentKey)
:x=>x.Url==Request.Url.GetLeftPart(UriPartial.Path);
您遇到的错误是什么?你所做的肯定是可能的。您得到的错误将帮助我们告诉您需要修复什么…请尝试Build(x=>(string.isnullorempty(ParentKey))?x.Url==Request.Url.GetLeftPart(UriPartial.Path):x.ParentKey==ParentKey)代码>在第三段代码中,您是否错过了调用“Build”方法?您可以尝试构建(x=>!string.IsNullOrEmpty(ParentKey)?(x.ParentKey==ParentKey):(x.Url==Request.Url.GetLeftPart(UriPartial.Path)))
我想知道是否有一个技术原因,为什么它不能像你刚才那样推断类型Func predicate=x=>x.Url==“blah”代码>或者,如果这只是没有分配开发人员时间的事情之一…旁注-这有点难读。我可能会坚持使用if/else,只是为了让它更容易阅读。@Chris可能与你不能只说var action=x=>true的原因相同代码>甚至var动作=(foox)=>true代码>-显然,lambda不能在运行时静态隐式键入,即使很明显签名是什么。从我所看到的,两个委托类型,即使具有相同的签名,也不可互换,就像两个具有相同定义的类不可互换一样。@JoeEnos-我明白你的意思,Joe,但是如果你使用Zohar的版本并格式化它,它看起来是可读的。你可以使用谓词
代替Func