Делегировать как параметр в конструкторе класса C # - PullRequest
2 голосов
/ 15 октября 2011

Привет, у меня есть класс с делегатом в качестве параметра, как показано в коде, но я получаю ошибки Error 1 Type expected ...\Classes\Class1.cs 218 33 Classes и Error 2 ; expected ...\Classes\Class1.cs 218 96 Classes. Как мне решить проблему? Заранее спасибо! Я пытаюсь передать его byref, поэтому, когда класс инициализируется, какой-то метод присоединяется к делегату.

public constructor(ref delegate bool delegatename(someparameters))
{
    some code
}

Ответы [ 3 ]

5 голосов
/ 15 октября 2011

Вы можете передать что-то вроде Action<T> ... не знаю, почему вы хотите передать это по ссылке. Например, у вас может быть такой метод:

static void Foo(int x, Action<int> f) {
    f(x + 23);
}

И назовите это так:

int x = 7;
Foo(x, p => { Console.WriteLine(p); } );
5 голосов
/ 15 октября 2011

Вы не можете объявить тип делегата в конструкторе. Сначала необходимо объявить тип делегата, а затем использовать его в конструкторе:

public delegate bool delegatename(someparameters);

public constructor(ref delegatename mydelegate)
{
   some code...
}
2 голосов
/ 15 октября 2011

1 - Почему вы используете ключевое слово ref?

2 - constructor - это имя класса?если нет, вы делаете это неправильно, в отличие от PHP: public function __construct( .. ) { } конструктор назван по имени класса, например:

class foo { 
   public foo() { } // <- class constructor 
}

3 - Обычно типы делегатов являются недействительными.

Вы ищете это?

 class Foo {

        public delegate bool del(string foo);

        public Foo(del func) { //class constructor
                int i = 0;
                while(i != 10) {
                        func(i.ToString());
                        i++;
                }
        }
    }

Тогда:

class App
{

    static void Main(string[] args)
    {

        Foo foo = new Foo(delegate(string n) {
                            Console.WriteLine(n);
                            return true; //this is it unnecessary, you can use the `void` type instead.          });
        Console.ReadLine();
    }
}

Вывод:

1
2
3
4
5
6
7
8
9
...