Typedef-эквивалент в C #? - PullRequest
       16

Typedef-эквивалент в C #?

3 голосов
/ 30 августа 2010

Я знаю, что этот точный вопрос был задан , но опубликованное там решение, похоже, не работает для меня. Вот код, который я пытаюсь:

namespace ConsoleApplication5
{
    class Program
    {
        enum Tile { Empty, White, Black };
        using Board = Tile[8,8];

И получаю ошибку:

Недопустимый токен, «использующий» в объявлении члена класса, структуры или интерфейса

Кажется, предложение "using" должно быть перемещено за пределы класса Program, но моего перечисления Tile там не существует. Так как мне это сделать?

Ответы [ 3 ]

7 голосов
/ 30 августа 2010

Похоже, вы пытаетесь использовать имя для представления конкретного способа создания массива Tile[,].

Почему бы просто не объявить метод, который делает это?

Tile[,] GetBoard()
{
    return new Tile[8, 8];
}

Другой вариант, хотя я бы посчитал это немного странным (не говоря уже о хакерстве), - это определить тип Board с неявным оператором для преобразования в Tile[,] следующим образом:

public class Board
{
    private Tile[,] tiles = new Tile[8, 8];

    public static implicit operator Tile[,](Board board)
    {
        return board.tiles;
    }
}

Это фактически позволит вам сделать это:

Tile[,] board = new Board();
6 голосов
/ 30 августа 2010

Вы не можете использовать using таким образом.

Вы можете использовать только для конкретных типов, а не для «конструкторов», как вы использовали.

2 голосов
/ 30 августа 2010

К сожалению, вы не можете использовать using для объявления имени типа массива.Я не знаю почему, но спецификация C # не позволяет этого.

Однако, вы можете довольно близко подойти, просто объявив Board как новый тип, содержащий нужный массив, например:

public class Board
{
    public Tile[,] Tiles = new Tile[8,8];
}

Теперь каждый раз, когда вы говорите new Board(), вы автоматически получаете массив плиток 8x8.

...