尝试链接委托者(多播委托)时出现“运算符‘+’不能应用于‘方法组’和‘方法组’类型的操作数”

问题描述 投票:0回答:1

以下代码

public class TypeTests {
    delegate int LogMessageDelegate(string message);
    
    int LogMessageToConsoleReturn1(string msg) {
        Console.WriteLine($"{msg} return 1");
        return 1;
    }

    int LogMessageToConsoleReturn2(string msg) {
        Console.WriteLine($"{msg} return 2");
        return 2;
    }

    [Fact]
    public void DelegateInvokesMethod() {
        LogMessageDelegate log;
        // log = LogMessageToConsoleReturn1; // assign to a method group
        // log += LogMessageToConsoleReturn2; // multicast using += works just fine
        log = LogMessageToConsoleReturn1 + LogMessageToConsoleReturn2; // multicast using + causes CS0019 compiler error
        Assert.Equal(2, log("Hello"));
    }
}

导致 CS0019 编译器错误,并显示以下消息

运算符“+”不能应用于“方法组”和“方法组”类型的操作数

它应该按照如何组合代表(多播代表)工作,其中指出

可以使用 + 运算符将多个对象分配给一个委托实例。

并进一步提供示例

multiDel = hiDel + byeDel;

其中

hiDel
byeDel
各自是一个方法组。


使用

+=
有效。即,如果我将测试更改为

    [Fact]
    public void DelegateInvokesMethod() {
        LogMessageDelegate log;
        log = LogMessageToConsoleReturn1; // assign to a method group
        log += LogMessageToConsoleReturn2; // multicast using += works just fine
        // log = LogMessageToConsoleReturn1 + LogMessageToConsoleReturn2; // multicast using + causes CS0019 compiler error
        Assert.Equal(2, log("Hello"));
    }

然后它就可以编译、运行并通过了。

c# delegates operator-overloading multicastdelegate
1个回答
0
投票

你需要这样做。不幸的是,在组合它们之前,您需要拥有委托的实例。

public class TypeTests
{
    delegate int LogMessageDelegate(string message);

    int LogMessageToConsoleReturn1(string msg)
    {
        Console.WriteLine($"{msg} return 1");
        return 1;
    }

    int LogMessageToConsoleReturn2(string msg)
    {
        Console.WriteLine($"{msg} return 2");
        return 2;
    }

    [Fact]
    public void DelegateInvokesMethod()
    {
        LogMessageDelegate log, first, second;
        // log = LogMessageToConsoleReturn1; // assign to a method group
        // log += LogMessageToConsoleReturn2; // multicast using += works just fine
        first = LogMessageToConsoleReturn1;
        second = LogMessageToConsoleReturn2;
        log = first + second; // multicast using + causes CS0019 compiler error
        Assert.Equal(2, log("Hello"));
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.