C # оператор объединения не заменяет возвращаемое значение нулевого метода? - PullRequest
5 голосов
/ 21 апреля 2011

У меня есть этот код:

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 ]

2 голосов
/ 21 апреля 2011

Просто предположение, потому что я делал эту ошибку раньше, и это меня очень долго сбивало с толку.

У вас есть условная точка останова, и в этой условной точке прерывания у вас есть условие _localMyClass = null?

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

0 голосов
/ 25 апреля 2011

Хорошо, поскольку самоответ уже принят, предварительный ответ на случай, если кому-то понадобится еще один возможный случай в будущем:

 FirstOrDefault() 

фактически вернет значение по умолчанию , который может быть null для ссылок на объекты, но не может быть таковым для типов значений .Если MyClass является типом значения (подумайте: struct), вам лучше будет

  • проверить значение по умолчанию (T) в универсальном методе
  • использование определенного значения с использованием расширения DefaultIfEmpty ()
  • с использованием типа MyClass?, допускающего обнуление (сокращение от Nullable)

$ 0,02

0 голосов
/ 25 апреля 2011

После закрытия и повторного открытия Visual Studio код работал нормально.

Я использую Visual Studio Ultimate 2010 с пакетом обновлений 1.

Я уже сталкивался с этим в прошлом, и я должен был вспомнить попробовать это в первую очередь.Я заметил, что VS иногда ведет себя странно, особенно при запуске веб-приложения в режиме отладки, особенно при локальном запуске веб-приложения (из моего локального IIS) и подключении к w3wp.exe.

...