不能使用三元运算符来分配Linq表达式

Dav*_*vid 3 c# linq type-inference linq-expressions

我刚输入以下代码:

Expression<Func<ContentItem, bool>> expression = 
                fileTypeGroupID.HasValue ? n => n.Document.MimeType.FileTypeGroupID == fileTypeGroupID.Value : n => true;
Run Code Online (Sandbox Code Playgroud)

Visual Studio说它不能推断出它的类型n.

代码对我来说似乎很好 - 它只是使用三元运算符将两个Expression文字中的一个分配给Expression变量.

Visual Studio是不是很聪明,不能推断出n三元运算符内部的类型,还是我犯了某种错误?

Eri*_*ert 12

几乎每天都会以某种形式询问这个问题.

条件运算符类型分析从,而不是从.条件运算符不知道其结果被分配的类型,然后强制后果和这些类型的替代.它恰恰相反; 它计算出结果和替代的类型,采用这两种类型的更一般,然后验证可以分配一般类型.

结果和替代方案不包含关于lambda的类型应该是什么的信息,因此不能推断条件的类型.因此无法验证分配是否正确.

它正在考虑为什么语言是这样设计的.假设你有重载:

 void M(Func<string, int> f) {}
 void M(Func<double, double> f) {}
Run Code Online (Sandbox Code Playgroud)

和一个电话

M( b ? n=>n.Foo() : n => n.Bar() );
Run Code Online (Sandbox Code Playgroud)

描述过载分辨率如何确定在从外到内推断类型的世界中选择M的哪个过载.

现在考虑一下:

M( b1 ? (b2 ? n=>n.Foo() : n => n.Bar() ) : (b3 ? n=>n.Blah() : n=>n.Abc()) );
Run Code Online (Sandbox Code Playgroud)

变得更难不是吗?现在假设Foo,Bar,Blah和Abc本身就是采用funcs的方法,并且还有包含lambdas的条件运算符的参数.

我们不希望类型推断过程如此复杂而没有相应的巨大好处,并且条件运算符没有这么大的好处.

在您的情况下,您应该做的是投射特定类型的结果和替代方案中的一个或两个.

  • @Gabe:给参数一个类型没有帮助.这不会给*lambda*一个类型.假设你说"(string x)=> false".那个表达的类型是什么?`谓词<字符串>`?`Func <string,bool>`?`Func <string,object>`?可能存在无限多种类型,无法说哪一种是最好的. (2认同)