What does cause this issue?
Похож на ошибку компилятора. По крайней мере, так оно и было. Хотя выражения decimal.TryParse(v, out a)
и decimal.TryParse(v, out b)
оцениваются динамически, I ожидал компилятора, чтобы понять, что к моменту, когда он достигнет a <= b
, определены как a
, так и b
. Даже с странностями, которые вы можете придумать при динамическом наборе текста, я ожидал, что когда-нибудь оценят a <= b
после оценки обоих вызовов TryParse
.
Однако, оказывается, что через оператор и преобразование сложного, это вполне возможно, чтобы иметь выражение A && B && C
который оценивает A
и C
но не B
- если вы хитрый достаточно. См. Roslyn bug report для изобретательного примера Нила Гафтера.
Выполнение этой работы с помощью dynamic
еще сложнее - семантика, связанная с динамическими динамиками, сложнее описать, поскольку для выполнения разрешения перегрузки вам необходимо оценить операнды, чтобы узнать, какие типы задействованы, что может быть нелогичный. Однако снова Neal придумал пример, который показывает, что ошибка компилятора требуется ... это не ошибка, это ошибка исправить. Огромное количество славы Нилу за его доказательство.
Is it possible to fix it through compiler settings?
Нет, но есть альтернативы, которые позволяют избежать ошибки.
Во-первых, вы можете остановить его от динамичной - если вы знаете, что вы будете только когда-либо использовать строки, то вы можете использовать IEnumerable<string>
или дают диапазон переменной v
тип string
(т.е. from string v in array
). Это был бы мой предпочтительный вариант.
Если вы действительно нужно держать его динамичным, просто дать b
значение, чтобы начать с:
decimal a, b = 0m;
Это не будет никакого вреда, - мы знаем, что на самом деле ваша динамическая оценка выиграл» t делайте что-нибудь безумное, так что вы все равно в конечном итоге присвоите значение b
, прежде чем использовать его, сделав начальное значение несущественным.
Кроме того, кажется, что добавление круглых скобок тоже работает:
where decimal.TryParse(v, out a) && (decimal.TryParse("15", out b) && a <= b)
Это меняет точку, в которой различные части разрешения перегрузки запускаются, и случается, чтобы сделать компилятор счастливым.
Существует один вопрос все еще остается - правила спецификации по определенному заданию с оператором &&
необходимо уточнить, чтобы заявить, что они применяются только, когда оператор &&
используется в «обычной» реализации с двумя bool
операндами , Я попытаюсь убедиться, что это исправлено для следующего стандарта ECMA.
@BinaryWorrier: Почему? Он использует только 'b' после назначения его через параметр' out'. –
[Документация VS 2015 говорит] (https://msdn.microsoft.com/en-us/library/kx37x362.aspx) «Хотя переменные, переданные как внешние аргументы, не должны быть инициализированы перед передачей, вызываемый метод требуется присвоить значение перед возвратом метода. " так что это выглядит как ошибка да, она гарантированно будет инициализирована этим tryParse. – Rup
Да, я тоже удивлен. Как я знаю, 'out' требует назначения внутри метода. Так что эта ошибка немного странная. – ramil89