Исключение Engine Execution Engine для объекта, который проходит нулевую защиту - PullRequest
0 голосов
/ 03 сентября 2018

Здравствуйте, может кто-нибудь объяснить, как один объект может пройти через NULL охранник, а затем выдать исключение при попытке доступа к ненулевому полю? (BOOL)

Как видно из приведенного выше метода, наш объект response типа Node не равен нулю. Обратите внимание на поле boolean IsArray !!

enter image description here

Посмотрим, что произойдет, когда наш response войдет в метод Deserialize:

Node is not null before entering Deserialize method

                                   Passes null guard !!

enter image description here

Затем происходит сбой с Null Reference Exception на non-nullable field. Именно на поле, которое я сказал, чтобы сфокусироваться: boolean IsArray.

Трассировка стека

{System.NullReferenceException: Object reference not set to an instance of an object.
   at redius.Node.get_Kind() in D:\Work\redius\core\redius\Internals\Resp\Node.cs:line 15
   at redius.Node.get_IsArray() in D:\Work\redius\core\redius\Internals\Resp\Node.cs:line 22
   at redius.Deserializer.List.Deserialize(Node node) in D:\Work\redius\core\redius\Internals\Formatter\Deserializer\Deserializer.List.cs:line 19}

Может кто-нибудь объяснить, как это возможно? Ниже приведен тип Node:

public abstract partial class Node : IEquatable<Node> {

        public enum Discriminator {
            String,
            Integer,
            Array
        }

        public Discriminator Kind => this.NodeKind;
        protected abstract Discriminator NodeKind { get; }

        public Node.Array AsArray => this as Node.Array;
        public Node.Integer AsInteger => this as Node.Integer;
        public Node.String AsString => this as String;

        public bool IsArray => this.Kind == Discriminator.Array;
        public bool IsString => this.Kind == Discriminator.Integer;
        public bool IsInteger => this.Kind == Discriminator.String;

        #region IRAW

        protected virtual ReadOnlyMemory<byte> GetRaw() {
            return new byte[] { };
        }

        #endregion

        public bool Equals(Node other) {
            if (this.Kind != other.Kind) {
                return false;
            }
            bool result;
            switch (other.Kind) {
                case Discriminator.Array: result = this.AsArray.Equals(other.AsArray); break;
                case Discriminator.Integer: result = this.AsInteger.Equals(other.AsInteger); break;
                case Discriminator.String: result = this.AsString.Equals(other.AsString); break;

                default: throw new NotImplementedException();
            }
            return result;
        }

    }

P.S: Когда Node входит в метод Deserialize, что-то не так с отладчиком, так как я не могу получить к нему доступ (не могу получить доступ к его полям)!

P.S 2 Если я попытаюсь добавить следующую строку в методе Deserializer:
var values = node.GetType().GetFields().Select(x => x.GetValue(node));
приложение переходит в состояние останова, и я получаю следующее исключение:
System Execution Engine Exception

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