Метод, который всегда возвращает ноль - PullRequest
0 голосов
/ 01 мая 2020

Я застрял с фрагментом кода, который я перевожу с Java на C#.

По сути, у меня есть карта (словарь) с ключами, состоящими из пары и значений, представленных как класс, сделанный мной (квадрат); в этом классе есть только одно поле, которое является необязательным (да, я создаю класс Optional в C#).

Вначале я заполняю этот словарь парами, чтобы сделать simil-grid и пустой Optional, как вы можете видеть из кода ниже.

class World
{
    private Dictionary<Pair<int, int>, Square> map = 
        new Dictionary<Pair<int, int>, Square>();

    public World(int width, int height)
    {
        this.size = new Pair<int, int>(width, height);
        for (int w = 0; w < this.size.GetX(); w++)
        {
            for (int h = 0; h < this.size.GetY(); h++)
                this.map.Add(new Pair<int, int>(w, h), 
                    new Square(Optional<Entity>.Empty()));
        }
    }
}

И это класс Square

class Square
{
    private Optional<Entity> entity;

    public Square (Optional<Entity> entity)
    {
        this.entity = entity;
    }

    public Optional<Entity> GetEntity() 
    {
        return this.entity;
    }

    public void SetEntity(Optional<Entity> entity)
    {
        this.entity = entity;
    }
}

Вот проблема, эта функция ниже всегда возвращает значение NULL, когда я пытаюсь получить существующее значение из словаря, он выдает System.NullReferenceException: ссылка на объект не установлена ​​на экземпляр объект. В этом коде я вырезал все элементы управления, но я знаю, что я пытаюсь получить уже вставленное значение; также я попытался запустить Dictionary.ContainsValue и вернуть false! Но у меня есть словарь.

public Square? GetSquare(int x, int y)
{
    if (y < this.size.GetY() && y >= 0 && < x this.size.GetX() && x >= 0)
    {
        this.map.TryGetValue(new Pair<int, int>(x, y), out Square? square);
        return square;
    }

    throw new InvalidOperationException("no square in this position!");
}

Я оставляю здесь и код класса Optional, но я почти на 100% уверен, что это не проблема

public class Optional<T>
{
    private T value;
    public bool IsPresent { get; set; } = false;

    private Optional() { }

    public static Optional<T> Empty()
    {
        return new Optional<T>();
    }

    public static Optional<T> Of(T value)
    {
        Optional<T> obj = new Optional<T>();
        obj.Set(value);
        return obj;
    }

    private void Set(T value)
    {
        this.value = value;
        this.IsPresent = true;
    }

    public T Get()
    {
        return value;
    }
}

Это пара класса

    public class Pair<X, Y>
    {
        private X first;
        private Y second;

        public Pair(X first, Y second)
        {
            this.first = first;
            this.second = second;
        }
        public X GetX()
        {
            return this.first;
        }

        public Y GetY()
        {
            return this.second;
        }

        public override string ToString()
        {
            return "<" + first + "," + second + ">";
        }
    }

1 Ответ

0 голосов
/ 02 мая 2020

Ок, решил. Проблема, как вы сказали, в классе Pair. Я подставил его в класс ValueTuple <>, и теперь все работает нормально, все равно спасибо.

...