2013-03-28 2 views
0

У меня такое ощущение, что заголовок вводит в заблуждение, отредактируйте его, если вы решите. когда я делаю это:условное поведение запроса linq

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); 

никаких жалоб. Зачем? Как второй способ отличается?

Edit:

Везде, мои окончательные прогнозы совпадают. (Final .Select (....) везде есть те же поля)

Edit2:

Я извиняюсь .. опечатка с моей стороны. Select() s везде не были одинаковыми. Метод 1 отлично работает, если соответствие прогнозов «

+3

Вы выбираете одно и то же в обоих случаях? Это действительно поможет, если вы дадите нам короткий, но * полный * пример случая, который не работает. –

+2

Хорошо, если вы поместите некоторые фактические значения в 'некоторый базовый запрос linq' и' from ... Select (..)) 'и т. Д., Люди смогут помочь. В противном случае это все догадки. В сообщении об ошибке четко указано, что он не видит никакого неявного преобразования между анонимным типом, возвращаемым первым выбором, и вторым выбором. В вашем последнем примере, предполагая, что у вас нет разных анонимных типов в 'use b here one way' и' use b here differently', он не дает этой ошибки. – publicgk

+1

@JonSkeet Я как раз собирался это сказать, похоже, что ваши выборки * разные *. – mattytommo

ответ

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} не одни и те же анонимные типы.

2

Если вы сделали бросок после запроса LINQ, все будет в порядке.

Его вроде той же проблемы, что вы получите то вы делаете что-то вроде

int? val = true ? 1 : null; 

Это не будет работать, но если вы бросили нуль, как это:

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

Он делает.

+0

Это не применимо в моем случае. Очевидно, если оба анонимных типа возвращаются в Select(), все хорошо – Brian

+0

@Brian Интересно, не знал этого! Должен был написать код компилятора для обработки этого случая, yikes. –

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, например, они будут одного типа.

+0

, по-видимому, до тех пор, пока соответствие анонимных типов «хорошо» – Brian

+1

@AnnL, относительно * Хотя я не уверен на 100%, ... *, [MSDN] (http://msdn.microsoft.com/en-us /library/vstudio/bb397696(v=vs.100).aspx) говорится: «Если два или более анонимных типа в одной и той же сборке имеют одинаковый номер и тип свойств, то в том же порядке компилятор рассматривает их как такой же тип. Они имеют одну и ту же информацию, генерируемую компилятором. « – publicgk

+0

@publicgk Спасибо! Это хорошая вещь, чтобы знать! –

Смежные вопросы