C# оператор объединения не заменяет возвращаемое значение нулевого метода?
У меня есть этот код:
MyClass _localMyClass = MyClassDAO.GetMyClassByID(123) ?? new MyClass();
Это метод:
public static MyClass GetMyClassByID(int id)
{
var query = from m in ctx.MyClass
where m.MyClassID == id
select m;
return query.FirstOrDefault<MyClass>();
}
Итак FirstOrDefault()
не находит попадания в контексте структуры сущности, который является объектом "ctx". Таким образом, возвращаемое значение по умолчанию null
, поскольку целью запроса является класс.
Результат первого бита кода, используя ??
, результаты в _localMyClass
быть чем? Я бы сказал, что это будет new MyClass()
, Вместо, _localMyClass
заканчивается нулем. Я попытался сгруппировать логику с различными наборами скобок, но все же не повезло.
Еще страннее; когда я устанавливаю точку останова отладки и копирую / вставляю MyClassDAO.GetMyClassByID(123) ?? new MyClass()
в экран просмотра Visual Studio, результат new MyClass()
вместо null
,
Кто-нибудь может объяснить, почему это будет работать таким образом? Почему он не распознает возвращаемое значение метода как null
а затем вместо этого используйте new
часть?
3 ответа
После закрытия и повторного открытия Visual Studio код работал нормально.
Я использую Visual Studio Ultimate 2010 с пакетом обновления 1.
Я имел это в прошлом, и я должен был вспомнить, чтобы попробовать это в первую очередь. Я заметил, что VS иногда ведет себя странно, особенно при запуске веб-приложения в режиме отладки, особенно при локальном запуске веб-приложения (из моего локального IIS) и подключении к w3wp.exe.
Просто предположение, потому что я сделал эту ошибку раньше, и это меня очень долго сбивало с толку.
Есть ли у вас условная точка останова, и в этой условной точке останова у вас есть условие как _localMyClass = null
?
Однажды я сделал что-то подобное, когда хотел написать ==
в условной точке останова, и это привело к тому, что отладчик установил значение null. Точно так же у вас есть какие-либо значения наблюдения, которые могли бы установить его на ноль?
Хорошо, поскольку самоответ уже принят, предварительный ответ на случай, если кому-то понадобится еще один возможный случай в будущем:
FirstOrDefault()
фактически вернет значение по умолчанию, которое может быть null
для ссылок на объекты, но не может быть таковым для типов значений. Если MyClass
это тип оценки (подумайте: struct
Вы бы лучше
- проверка по умолчанию (T) в универсальном методе
- используя определенное значение, используя расширение DefaultIfEmpty()
- с использованием
MyClass?
обнуляемый тип (сокращение от Nullable)
$ 0,02