我曾經認爲委託行爲就像Vala中的方法引用。不過,我不明白爲什麼下面的代碼不工作:爲什麼Vala不能將信號連接到代表?
class Bar {
public signal void bar_signal();
}
class Foo : Object {
public Foo(int i, Bar bar) {
bar.bar_signal.connect(bar_handler(i + 1));
}
public delegate void Handler();
private static Handler bar_handler(int j) {
return() =>
{
stdout.printf("handler: %d\n", j);
};
}
}
public static void main(string[] args) {
Bar bar = new Bar();
new Foo(1, bar); // will be finalized immediately
bar.bar_signal();
}
這段代碼的成語實際上是在JavaScript中,這使得大量使用封閉的相當典型。可悲的是,valac
說:
Test.vala:8.33-8.45: error: Argument 1: Cannot convert from
Foo.Handler
toBar.bar_signal
起初,我以爲這可能以下incompatibility of delegate types是由於:
Instance and static delegate instances are not interchangeable.
然而,誤差不改變,如果我把一個static
入聲明的代表。
我搜索了網頁,但是從2009年開始只有an old mailing list entry,這說明這是Vala中的一個bug。是對的嗎?如果是這樣的話:7年後,這個錯誤仍然沒有解決,怎麼會這樣呢?