我觉得标题有误导性,如果您愿意,请编辑。当我这样做时:
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);
没有抱怨。为什么?第二种方式有何不同?
编辑:
到处都是,我的最终预测是一样的。 (最后。选择(....)到处都有相同的字段)
Edit2:
我道歉...我的错字。 Select()s到处都不一样。如果投影“匹配”
,方法1也可以正常工作答案 0 :(得分:2)
如果你在LINQ查询后进行了演员表,一切都会好的。
你遇到的问题与
类似int? val = true ? 1 : null;
这不起作用,但是如果你像这样抛出null:
int? val = true ? 1 : (int?)null;
确实如此。
答案 1 :(得分:2)
条件表达式需要它评估的两个操作数是相同的类型。所以,如果你这样做
var a = (condition)? "A" : "B";
......两个" A"和" B"属性相同(字符串),因此结果a
的类型为string
。
您的错误消息告诉您的是,您的两个操作数(两个from ... Select
语句)评估为匿名类型,但不是相同的匿名类型,并且它无法将一个匿名类型转换为另一个。因此,它不知道结果q
应该是什么类型。
虽然我不是百分百肯定,但我相信即使你的两个表达方式完全相同,它们也会是不同的匿名类型。无论如何,您收到该错误的事实表明它们不是同一个匿名类型。
使用第二组语句,首先将b
设置为等于linq查询的结果。因此它有一种类型。尽管您的陈述确实如此,但代码编译意味着(use b here one way)
和(use b here differently)
返回相同类型的结果。例如,如果它们都返回与b
相同类型的实例,则它们将具有相同的类型。
答案 2 :(得分:2)
它认为错误消息解释了这一点:
无法确定条件表达式的类型,因为 匿名类型之间没有隐式转换。
这个
var x = 0 < 2 ? new { a = 1 } : new { a = 2 }
会编译。但是这个
var x = 0 < 2 ? new { a = 1 } : new { b = 2 };
会出现上述错误,因为{a=1}
和{b=2}
的匿名类型不同。