2014-01-21 7 views
0

У меня есть сценарий, где мне нужно запросить объект, и если null возвращается, тогда мне нужно запросить один и тот же объект по-другому, я решил использовать нуль-коалесцирующий оператор, вот код:FirstOrDefault неожиданный результат при смешивании с нулевым коалесцирующим оператором

var requestedMaterials = request.Lines.FirstOrDefault(
          w => w.Description.Trim() == material.Description.Trim() && 
          w.Grade.Grades.Any(q => q.Quantity > 0)) ?? 
          request.Lines.FirstOrDefault(w => w.Description.Trim() == material.Description.Trim() && w.Quantity > 0) 

левый операнд должен вернуть нуль, правая рука не так, на самом деле, если установить его в переменной я могу видеть его не нулевой, но по какой-то причине , когда я использую оба запроса таким образом, requestMaterials имеет значение null, а не имеет значение правого операнда.

Я подтвердил, что, когда я задал эти два запроса для переменных и использовал '??' оператор на них, он работает так, как ожидалось, я оставил его таким образом на данный момент, но мне действительно интересно, почему это не сработало по-другому.

Рабочий пример (requestedMaterials заполняется с materialsWithoutGrade):

var materialsWithGrade = request.Lines.FirstOrDefault(w => w.Description.Trim() == material.Description.Trim() && w.Grade.Grades.Any(q => q.Quantity> 0)); 
var materialsWithoutGrade = request.Lines.FirstOrDefault(w => w.Description.Trim() == material.Description.Trim() && w.Quantity> 0); 

var requestedMaterials = materialsWithGrade ?? materialsWithoutGrade; 
+1

Когда вы говорите, что это не работает, вы получаете сообщение об ошибке? – twrowsell

+0

@twrowsell: nope, requestMaterials имеет значение null, и он должен иметь значение правого операнда, я отредактирую свой вопрос, чтобы сделать его более понятным. – BrenoSarkis

+0

, так что вы запустили request.Lines.FirstOrDefault (w => w.Description.Trim() == material.Description.Trim() && w.Quantity> 0) и возвращает ненулевую ссылку? – twrowsell

ответ

0

FirstOrDefault возвращает либо значение, если совпадение найдено, остальное возвращается по умолчанию (TSource). The ?? был возвращен по умолчанию (TSource), который может быть чем угодно (значение null или значение по умолчанию для типа TSource). После того, как вы присвоите результат переменной, теперь переменная содержит нулевое значение. так ?? теперь может работать так, как ожидалось.