以下代码

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 compiler error级的爆炸

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

它应该每How to combine delegates (Multicast Delegates)个国家工作一次

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

并进一步给出了实例

multiDel = hiDel + byeDel;

其中,hiDelbyeDel分别是方法组.


使用+=件作品.也就是说,如果我将测试更改为

    [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"));
    }

然后它编译、运行并通过.

推荐答案

在不幸地组合它们之前,您需要拥有您的代理的实例.下面我给它们分别命名为firstsecond.

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"));
    }
}

但也有另一种方法,一个小诀窍:

log = (LogMessageDelegate)LogMessageToConsoleReturn1 + LogMessageToConsoleReturn2;

Csharp相关问答推荐

Microsoft. SQLServer. Types(106.1000.6)在try 从用户定义的类型检索值时引发异常

WPF Windows初始化正在锁定. Net 8中分离的线程

try 在Blazor项目中生成html

如何使用C#Interop EXCEL创建度量衡

如何在不考虑年份的情况下判断日期时间是否在某个日期范围内?

如何从ASP.NET核心MVC视图和Blazor传递数据

为什么在使用动态obj+类obj时会调用串联?

如何使用NumberFormatInfo

如何将字符串变量传递给JObject C#-无法加载文件或程序集';System.Text.Json

从另一个不同 struct 的数组创建Newtonsoft.Json.Linq.J数组

当使用Dapper映射DBNull时,我可以抛出异常吗?

Blazor服务器项目中的Blazor/.NET 8/Web API不工作

Maui:更改代码中的绑定字符串不会更新UI,除非重新生成字符串(MVVM)

如何使用LINQ在C#中填充列表列表?

在C#中通过Matheval使用自定义公式

ASP.NET核心中的授权,如何在DbContext启动之前提供租用ID

SignalR跨域

使用LibraryImport在多个dll中导入相同的函数

如何在C#中抽象Vector256;T<;的逻辑以支持不同的硬件配置?

从具有泛型类型约束的类继承-Blazor