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

Другие вопросы по тегам