2016-08-18 85 views
1

我曾經認爲委託行爲就像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 to Bar.bar_signal

起初,我以爲這可能以下incompatibility of delegate types是由於:

Instance and static delegate instances are not interchangeable.

然而,誤差不改變,如果我把一個static入聲明的代表。

我搜索了網頁,但是從2009年開始只有an old mailing list entry,這說明這是Vala中的一個bug。是對的嗎?如果是這樣的話:7年後,這個錯誤仍然沒有解決,怎麼會這樣呢?

回答