Метод, возвращающий ненулевое значение, по-прежнему присваивает переменной значение null - PullRequest
3 голосов
/ 04 июня 2019

У меня есть метод, который ищет что-то в моей базе данных в соответствии с полем. при вызове этого метода и сохранении возвращаемого значения в переменной возвращаемое значение не равно нулю в конце функции. После вызова функции и отладки того, что доступно в моей переменной, значение по-прежнему равно нулю!

В одном классе у меня есть:

var box = _someClass.GetBoxByRfidAsync("testvalue");
public Box GetBoxByRfidAsync(string rfid)
{
    var foundBox = _dc.Boxes
        .Include(b => b.Stack)
        .Include(b => b.Type)
        .Where(box => box.RFID1 == rfid)
        .FirstOrDefault();

     return foundBox;
}

Класс box выглядит следующим образом:

public class Box
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ID { get; set; }
    public string RFID1 { get; set; }
    public string Rit { get; set; }
    public Stack Stack { get; set; }
    public int PosInStack { get; set; } //lowest box is 0, highest is 7
    public BoxType Type { get; set; }
    public DateTime Inserted { get; set; }

}

Метод выполняется, и в конце GetBoxByRfidAsync я вижу, используя отладчик, что foundBox НЕ является нулевым.

Я перехожу через конец функции и перехожу к присвоению значения foundBox переменной box. По какой-то причине переменная 'box' остается нулевой и не изменяется.

Переменная box должна быть равна значению foundBox, но она остается нулевой.

Вот несколько скриншотов моего сеанса отладки:

End of method Immediate window showing box is still null

1 Ответ

6 голосов
/ 04 июня 2019

Ошибка, отображаемая в отладчике, не означает, что box равно null.Если бы box было null, оно буквально просто сообщило бы: null.

Вместо этого box не является null, и что-то, что отладчик оценивает для отображениязначение вызывает исключение.Возможно сломанный ToString().Тот факт, что в нем упоминается ListDictionaryInternal, означает, что вы, возможно, захотите , в частности , узнать о любом использовании коллекции или словаря внутри типа и, возможно, обо всем, что помечено атрибутами "отладчика", такими как [DebuggerDisplay(...)].

Если вы хотите проверить, является ли box значением null, спросите ближайшую консоль:

box == null

, и она вернет true или false (предостережение: предполагая, что не существует сломанного оператора статического равенства, что также возможно; во избежание этого хорошей альтернативой является:

box is object

, который будет надежно возвращать true, если это не null, и false, если это null, без использования операторов статического равенства.


Редактировать: основываясь на обсуждении в комментариях, яубедительно убежден, что это неработающий оператор ==, как показано здесь:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...