_Q12_ Ответов: 3

Как создать массив void?


void[] Stack01 = { Card01(),Card02() };  <<<<<<?????????

        public void Card01()
        {
            point = 1;
        }
        public void Card02()
        {
            point = 2;
        }


Что я уже пробовал:

я не вру, я попробовал код и не сработал. :)

NotPolitcallyCorrect

Вам серьезно нужно научиться задавать вопросы.

_Q12_

:) английский = мой второй язык. :)
Но не стесняйтесь ... переформулировать ...

NotPolitcallyCorrect

Ну и что?

NotPolitcallyCorrect

Переформулировать что? Переформулировать "не сработало"? Как может кто-то, кроме тебя, сделать это? Мы не можем читать твои мысли. Вы могли бы подумать, что через 9 лет вы уже знаете это.

3 Ответов

Рейтинг:
21

OriginalGriff

Вы не можете создать массив void - это специальное ключевое слово, которое означает "не возвращает значения", и это вообще не тип данных. Вы можете создавать только массивы ссылочных типов и типов значений, оба из которых являются производными от object и void ни один из этих.

То, что вы пытаетесь сделать, это настроить массив делегатов, которые не возвращают никакого значения:

private delegate void pd();

Затем вы можете использовать их в своем коде:
pd[] stack01 = { Card01, Card02 };

stack01[0]();
Console.WriteLine(point);
stack01[1]();
Console.WriteLine(point);


_Q12_

Ух ты, очень круто !
но я получаю красные волнистые линии внутри объявления массива.
"Инициализатор поля не может ссылаться на нестатическое поле, метод или свойство ..."
Я использую VS2010-не последнюю версию.

OriginalGriff

Это происходит потому, что вы помещаете объявление вне метода, а инициализация пытается ссылаться на нестатические (т. е. специфичные для экземпляра класса) методы.
Если вам нужно использовать нестатические методы, то вы не можете использовать инициализатор вне нестатического метода.
Попробовать это:

частная делегата недействительными др();
частная др[] stack01 = нуль;

а затем поместите это в свой конструктор класса:

stack01 = новый pd [] { Card01, Card02 };

_Q12_

уууу - большое вам спасибо!
Я сделал их публичными, чтобы их можно было увидеть снаружи объекта!
И работает как заклинание.
Действительно вау !
Удивительно!
Спасибо!

OriginalGriff

Пожалуйста!

Рейтинг:
1

Henrik Jonsson

Вместо использования void или пользовательский делегат вы можете использовать System.Action делегат (доступен с .NET 3.5):

class Test
    {
        readonly Action[] Stack01;
        int point;

        public Test()
        {
            Stack01 = new Action[] { Card01, Card02 };
        }    
            
        // Invoke card with index
        public void Card(int index)
        {
            Stack01[index - 1]();
        }

        public void Card01()
        {
            point = 1;
        }
        public void Card02()
        {
            point = 2;
        }
    }


_Q12_

Спасибо!

Рейтинг:
1

Richard MacCutchan

Я настоятельно рекомендую вам скачать .Остаточная ноль, Чарльз Петцольд[^] и потратьте некоторое время на правильное изучение C#.


_Q12_

Я скачал книгу. Я прочту его (надеюсь).
Хотя, должен сказать, я программирую весело, и если я смогу узнать что-то новое по пути...эх... Но я никогда не буду (настоящим) программистом. У меня такое чувство. :)
Спасибо за ваш прекрасный подарок.