2017-09-16 144 views
1

委託只能在靜態方法上調用。我跑下面的代碼和錯誤作爲方法名稱預計在行可以委託調用實例方法嗎?

NuOp nuopAdd = new NuOp(x.Addition(324324,4324324));

NuOp nuopMultiply = new NuOp(x.Multiplication(4324,24234));

namespace DelegateEtAl 
{ 
    public delegate double NuOp(double a, double b); 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      Mop x = new Mop(); 
      NuOp nuopAdd = new NuOp (x.Addition(324324, 4324324)); 
      NuOp nuopMultiply = new NuOp(x.Multiplication(4324, 24234)); 

      Console.Out.WriteLine(nuopAdd); 
      Console.Out.WriteLine(nuopMultiply); 
     } 
    } 

    public class Mop 
    { 
     public double Addition(double opA, double opB) 
     { 
      return opA + opB; 
     } 

     public double Multiplication(double opA, double opB) 
     { 
      return opA + opB; 
     } 
    } 
} 

當Google搜索,我發現了對付只有靜態方法的例子。但下面的鏈接狀態

https://msdn.microsoft.com/en-us/library/aa288459(v=vs.71).aspx

對於靜態方法,委託對象封裝被 調用的方法。對於實例方法,委託對象在實例上封裝了一個 實例和一個方法。

謝謝。

+1

那麼你的問題是,你正在實例化一個委託**和**試圖在同一時間傳遞參數 – MickyD

回答

1

您可以使用靜態或非靜態方法調用委託。沒有任何這樣的限制。但是,你必須如下做到這一點:

NuOp nuopAdd = x.Addition; 
NuOp nuopMultiply = x.Multiplication; 

Console.Out.WriteLine(nuopAdd(324324, 4324324)); 
Console.Out.WriteLine(nuopMultiply(4324, 24234)); 

與你用你的委託方式的問題是,你沒有正確初始化它們。

代表是一種類型表示與 特定參數列表方法引用和返回類型:如果你讀委託here的定義,這是明確的。當您實例化 委託時,可以將其實例與任何具有 兼容簽名和返回類型的方法相關聯。您可以通過委託實例調用(或調用) 方法。

有關我們如何使用代表的更多信息,請查看here

簡而言之,代表NuOp可以指向任何方法,它接受兩個double類型的參數並返回一個double。爲了讓你安插NuOp,你只需要像上面那樣在NuOp上指定這樣一種方法的簽名。

+0

謝謝朋友,你的答案給了我解決方案 – luckyluke

+0

@luckyluke歡迎您!我很高興我幫助:) – Christos