0

我觉得标题有误导性,如果您愿意,请编辑。当我这样做时:

var q  = (condition)?(from ...Select(..)): (from.. Select(..));

我在“:”处收到错误说

Type of conditional expression could not be determined because 
there is no implicit conversion between anonymous types. 

但如果我这样做:

var b = some base linq query;
var q = (condition)?(use b here one way):(use b here differently);

没什么好抱怨的。为什么?第二种方式有什么不同?

编辑:

在任何地方,我的最终预测都是一样的。(最终的 .Select(....) 到处都有相同的字段)

编辑2:

我道歉..我的错字。各处的 Select() 都不相同。如果投影“匹配”,方法 1 也可以正常工作

4

3 回答 3

2

如果你在你的 LINQ 查询之后做了一个演员,一切都会好起来的。

它与您遇到的问题相同,然后您执行类似的操作

int? val = true ? 1 : null;

那是行不通的,但是如果您像这样转换 null :

int? val = true ? 1 : (int?)null;

确实如此。

于 2013-03-28T21:17:01.790 回答
2

条件表达式需要它评估的两个操作数是相同的类型。所以如果你这样做

var a = (condition)? "A" : "B";

... "A" 和 "B" 都属于同一类型(字符串),因此结果 ,a将属于string.

您的错误消息告诉您的是,您的两个操作数(两个from ... Select语句)评估为匿名类型,但不是相同的匿名类型,并且它不能将一种匿名类型转换为另一种匿名类型。因此它不知道结果q应该是什么类型。

虽然我不是 100% 肯定,但我相信即使你的两个表达式完全相同,它们也会是不同的匿名类型。无论如何,您收到该错误的事实表明它们不是相同的匿名类型。

使用第二组语句,您首先设置b为等于 linq 查询的结果。因此它有一个类型。尽管您的陈述确实如此,但代码编译的事实意味着(use b here one way)(use b here differently)返回相同类型的结果。例如,如果它们都返回与 相同类型b的实例,则它们将属于相同类型。

于 2013-03-28T21:18:32.777 回答
2

它认为错误消息解释了这一点:

无法确定条件表达式的类型,因为匿名类型之间没有隐式转换。

var x = 0 < 2 ? new { a = 1 } : new { a = 2 }

会编译。但是这个

var x = 0 < 2 ? new { a = 1 } : new { b = 2 };

会给出上面的错误,因为 {a=1}and{b=2}不是相同的匿名类型。

于 2013-03-28T21:18:48.563 回答