以下代码
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"));
}
然后它就可以编译、运行并通过了。
你需要这样做。不幸的是,在组合它们之前,您需要拥有委托的实例。
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"));
}
}