Я застрял с фрагментом кода, который я перевожу с 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 + ">";
}
}