2015-02-26 4 views
-3

В 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; } 
} 
+0

Вы обрабатываете индексаторы, поскольку это будет статическое свойство, но это не так. Вам нужен экземпляр TileMap для использования индексатора? –

+2

Просьба показать больше кода вызова - в частности, есть ли у вас * переменная *, называемая 'TileMap'? (Просто для ясности попробуйте называть его чем-то другим, кроме имени вашего типа ...) –

+0

Ну ... У меня есть код вызова для компиляции, используя следующее. возможноTile = TileMap [(int) возможныйPosition.x, (int) возможныйPosition.y]; ... но это сжимается на соломинках! – Dib

ответ

1

Проблема заключается в том, что ваше TileMap свойства не относится к типу TileMap, это типа PathFindingMapTile[,], который требует два индекса.

+0

Извините, теперь я прояснил этот пример, чтобы показать, что «TileMap» не относится к статическому экземпляру, но является свойством экземпляра, которое имеет то же имя, что и тип. – Dib

+0

Я вижу. Обновлен мой ответ ... –

+0

Мой плохой. Первоначально TileMap был массивом PathFindingMapTile, но я реорганизовал его как объект TileMap, который имел массив как внутренний член. Я забыл реорганизовать тип возвращаемого свойства. Еще раз спасибо. – Dib

 Смежные вопросы

  • Нет связанных вопросов^_^