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的条件运算符的参数.
我们不希望类型推断过程如此复杂而没有相应的巨大好处,并且条件运算符没有这么大的好处.
在您的情况下,您应该做的是投射特定类型的结果和替代方案中的一个或两个.
| 归档时间: |
|
| 查看次数: |
2332 次 |
| 最近记录: |