2012-05-12 34 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