将 Boo 方法添加到 C# 多播委托时出错



我正在开发一些Boo代码,需要由C#中的现有委托通知。我在 ActionBoo 类的构造函数中收到 Boo 编译错误。请参阅错误消息以及我尝试过的每个替代方案。

# Boo
import System
class ActionBoo:
    def constructor():
        # Alternative #1
        # ActionBoo.boo(9,25): BCE0051: Operator '+' cannot be used with a left hand side of type 'System.Action' and a right hand side of type 'callable(int) as void'.
        ActionCS.action += Boo
        # Alternative #2
        # ActionBoo.boo(13,25): BCE0051: Operator '+' cannot be used with a left hand side of type 'System.Action' and a right hand side of type 'System.Action'.
        ActionCS.action += Action[of int](Boo)
        # Alternative #3
        # This works, but it resets the delegate already set up in C#
        ActionCS.action = Boo
    def Boo(boo as int):
        print 'Boo: ' + boo
actioncs = ActionCS()
actionBoo = ActionBoo()
ActionCS.action(3)

ActionCS是具有多播委托的现有 C# 代码。以下是原始代码的简化版本:

// C#
using System;
public class ActionCS
{
    public static Action<int> action;
    public ActionCS()
    {
        action += Foo;
        action += Bar;
    }
    public void Foo(int foo)
    {
        Console.WriteLine("Foo: " + foo);
    }
    public void Bar(int bar)
    {
        Console.WriteLine("Bar: " + bar);
    }
    public static void Main(string[] args)
    {
        ActionCS actioncs = new ActionCS();
        action(5);
    }
}

以下是我在Linux上使用Mono(v2.10.9-0)和Boo(v0.9.4.9)进行编译的方式:

$ mcs ActionCS.cs
$ mono booc.exe -r:ActionCS.exe ActionBoo.boo

C# 代码和 Boo 的"替代 #3"通过调用以下命令运行良好:

$ mono ActionCS.exe
Foo: 5
Bar: 5
$ env MONO_PATH=$MONO_PATH:$BOO_HOME/bin mono ActionBoo.exe
Boo: 3

有谁知道如何修复Boo代码?

在 C# 中,+= 只是 Delegate.Combine 的语法糖,所以你可以改用它:

ActionCS.action = Delegate.Combine(ActionCS.action, Action[of int](Boo))

(请注意,我对Boo一无所知,只对一般的.NET一无所知,所以这只是一个有根据的猜测)

相关内容

  • 没有找到相关文章

最新更新