2013-11-18 3 views
2

Я разрабатываю код Boo, который должен быть уведомлен существующим делегатом на C#. Я получаю ошибку компиляции Boo в конструкторе класса ActionBoo. См. Сообщение об ошибке вместе со всеми альтернативами, которые я пробовал.Ошибка при добавлении метода Boo к делегату multicast C#

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

Вот как я скомпилирован с Mono (v2.10.9-0) и Boo (v0.9.4.9) на Linux:

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

C# код и Бу «Вариант № 3» прекрасно работают по телефону:

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

кто-нибудь знает, как исправить код Boo?

+0

Это просто код «Boo», который здесь не работает, не так ли? Ответ был добавлен (теперь удален), говорящий о мульти-литье; * этот бит * был неправильным (все делегаты в .NET являются многолистовыми), но: добавляет ли ключевое слово 'event' fix it (т. е.' public static event Action action; '? Интересно, работает ли только« Boo »с формальный 'event' и не работает с обнаженными полями делегатов –

+1

btw, статические события - действительно хороший способ вызвать утечку памяти. –

+0

Изменение на событие, скомпилированное и обработанное. Однако я не могу реально изменить производственный код C#. Спасибо за дополнительную информацию, я буду исследовать утечку памяти. – mmmaes

ответ

1

В C# += это просто синтаксический сахар для Delegate.Combine, так что вы могли бы использовать, что вместо того, чтобы:

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

(обратите внимание, что я ничего не знаю, Boo конкретно только о .NET в целом, так это всего лишь образованное предположение)

+0

Он скомпилирован и работал точно так же, как и размещено. Спасибо. – mmmaes