2012-05-12 138 views
1

我有兩個班,第一:傳遞委託從類

public class A 
    { 
     public delegate void Function(); 

     public string name; 
     public Function function; 

     public A(string name, Function function) 
     { 
      this.name = name; 
      this.function = function; 
     } 
    } 

而在第二:

public class B 
    { 
     public delegate void Function(); 
     List<A> ListA; 

     // somewhere in function 
     void F() 
     { 
      ListA[i].function(); 
     } 
     // --- 

     public void AddA(string name, Function function) 
     { 
      ListA.Add(new A(name, function)); // error here 
     } 
    } 

它拋出這些錯誤:

Error 2 Argument 2: cannot convert from 'App.B.Function' to 'App.A.Function' 
Error 1 The best overloaded method match for 'App.A.A(string, App.A.Function)' has some invalid arguments 

如何解決這個?

+0

的答案是不夠好..而且還要檢查這個http://www.codeproject.com/Articles/71154/C-Delegates -101-A-Practical-Example –

回答

7

您已經聲明Function代表兩次,一個A類內部,一個裏面B.
所以他們是兩種不同的類型,一種叫App.B.Function另一種叫App.A.Function

如果你想用兩個類分享這一委託,只是聲明瞭一次,出類(在裝配範圍IE)的範圍如:

public delegate void Function(); 

public class A 
{ 
    public string name; 
    ... 
} 

public class B 
{ 
    List<A> ListA; 
    ... 
} 

然而,在System命名空間存在一定數量的可用於表示各種功能的通用委託。看看System.Action<>System.Func<>類型。

+3

或使用'System.Action'。 – svick

+0

@svick:是的,答案已更新;) – digEmAll

0

它發生的原因是,Function在每個clases申報兩次,一次

+1

我認爲你的意思是在每個班級宣佈一次,而不是兩次(這將是四次)。 – Servy

+0

你說得對。謝謝。 – gabba