Я разрабатываю код 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?
Это просто код «Boo», который здесь не работает, не так ли? Ответ был добавлен (теперь удален), говорящий о мульти-литье; * этот бит * был неправильным (все делегаты в .NET являются многолистовыми), но: добавляет ли ключевое слово 'event' fix it (т. е.' public static event Action action; '? Интересно, работает ли только« Boo »с формальный 'event' и не работает с обнаженными полями делегатов –
btw, статические события - действительно хороший способ вызвать утечку памяти. –
Изменение на событие, скомпилированное и обработанное. Однако я не могу реально изменить производственный код C#. Спасибо за дополнительную информацию, я буду исследовать утечку памяти. – mmmaes