Могут ли делегаты переносить классы в C#? - PullRequest
0 голосов
/ 19 апреля 2020

В C ++ у нас есть тип std::function, который можно использовать для переноса лямбд, функций и даже пользовательских классов. Вот пример пользовательского класса, заключенного в std::function:

#include <functional>

struct A {
    void operator()() {
    }
};

std::function<void()> a = A();

Я, хотя то же самое было возможно с делегатами в C#, но я не могу заставить его работать:

class Program
{
    delegate void Foo();

    class Bar
    {
        public void Invoke()
        {

        }
    }

    static void Main()
    {
        new Foo(new Bar()); // CS0149: Method name expected
    }
}

Я убежден, что это должно быть как-то возможно, потому что оператор delegate внутренне создает новый класс, который наследуется от System.Delegate, что говорит о том, что я могу создать свой собственный тип, чтобы сделать то же самое.

1 Ответ

1 голос
/ 19 апреля 2020

Простой ответ - «нет», поскольку C# не имеет operator(), как в C ++.

Однако лямбда-выражение может использоваться не только для хранения функции, но и для функции для указанного c объекта .

class Program
{
    delegate void Foo();

    class Bar
    {
        public void Invoke()
        {

        }
    }

    static void Main()
    {
        var f = new Foo(new Bar().Invoke); 
    }
}

Разница заключается лишь в том, что в C# необходимо указывать имя метода, а не значение по умолчанию.

Также стоит отметить, что, как и в C ++, C# имеет универсальные средства, которые могут помочь в этом, поэтому мы можем полностью исключить объявление Foo:

var f = new Action(new Bar().Invoke);
...