В C# возможно ли иметь свойство Indexer типа, который не является строкой или int?В C# возможно ли иметь собственное свойство Indexer типа, который не является строкой или int?
Например, у меня есть пользовательский объект, который представляет собой карту двумерных векторных координат. Основываясь на моем классе карты ...
public class TileMap
{
/// <summary>
/// The holds an array of tiles
/// </summary>
MapTile[,] _map;
/// <summary>
/// Gets the <see cref="PathFindingMapTile"/> with the specified position.
/// </summary>
/// <value>
/// The <see cref="PathFindingMapTile"/>.
/// </value>
/// <param name="position">The position.</param>
/// <returns></returns>
public MapTile this[Vector2 position] // Indexer declaration
{
get
{
int x = (int)position.x;
int y = (int)position.y;
return _map[x, y];
}
}
/// <summary>
/// Initializes a new instance of the <see cref="TileMap"/> class.
/// </summary>
/// <param name="length">The length.</param>
/// <param name="height">The height.</param>
public TileMap(int length, int height)
{
_map = new MapTile[length, height];
}
}
Это компилируется без проблем. Однако код вызова терпит неудачу с двумя ошибками
Базовый класс
internal abstract class MyBase
{
/// <summary>
/// Gets (or privately sets) the tile map
/// </summary>
protected PathFindingMapTile[,] TileMap { get; private set; }
}
производный класс
internal class MyDerived : MyBase
{
public void MyMethod()
{
Vector2 possiblePosition;
MapTile possibleTile = null;
possibleTile = this.TileMap[possiblePosition]; // <-- This line wont compile
}
}
ошибки компиляции:
Cannot implicitly convert type 'UnityEngine.Vector2' to 'int'
Wrong number of indices inside []; expected 2
Почему два индекса? Я сказал только одну, позицию. Какие-либо предложения?
Обновление - После комментария Rufus. Исправлен возвращаемый тип свойства «Tilemap» базового класса.
internal abstract class MyBase
{
/// <summary>
/// Gets (or privately sets) the tile map
/// </summary>
protected TileMap TileMap { get; private set; }
}
Вы обрабатываете индексаторы, поскольку это будет статическое свойство, но это не так. Вам нужен экземпляр TileMap для использования индексатора? –
Просьба показать больше кода вызова - в частности, есть ли у вас * переменная *, называемая 'TileMap'? (Просто для ясности попробуйте называть его чем-то другим, кроме имени вашего типа ...) –
Ну ... У меня есть код вызова для компиляции, используя следующее. возможноTile = TileMap [(int) возможныйPosition.x, (int) возможныйPosition.y]; ... но это сжимается на соломинках! – Dib