2014-09-23 56 views
0

被賦予任務將VS2005中編寫的.net 2的一些代碼升級到使用VS2010的.net 4。當試圖編譯代碼時,我發現了錯誤:使用委託在一個匿名方法in.net 4

無法轉換匿名方法委託類型「AssignParameter」因爲參數類型不匹配的委託參數類型

有問題的編譯代碼錯誤所指向的是:

AssignParameter ap = delegate(Database db, DbCommand cmd) 
{ 
    db.AddInParameter(cmd, _jobIDParameterString, DbType.Int32, jobid); 
}; 

DatabaseHelper.LoadDataSet(ap); 

所以我跟蹤代碼的位置,該委託引用生活:

public delegate void AssignParameter(Database db, DbCommand cmd); 
public class DatabaseHelper 
{ 
    private static Database msSqlDb; 

    public static DataSet LoadDataSet(AssignParameter parameter) 
    { 
     ... 
     DbCommand command = ... 
     // Assign parameter 
     if (parameter != null) 
     { 
      parameter(msSqlDb, command); 
     } 
     ... 
    } 
} 

所以我讀過,委託關鍵字不能以這種方式

http://staceyw1.wordpress.com/2007/12/22/they-are-anonymous-methods-not-anonymous-delegates/

可以使用,但仍然在努力理解如何解決我的問題。

我試圖

  • 鑄造委託
  • 創建一個新的AssignParameter呼叫,但問題還有,我沒有任何數據庫或對象的DbCommand提供

你有什麼如何解決這個問題的建議?

+1

用'(db,cmd)=>'替換'委託(數據庫db,DbCommand cmd)'' – itsme86 2014-09-23 15:45:33

+1

@ itsme86他使用的語法沒有問題。你的建議在功能上是等同的。 – Servy 2014-09-23 15:50:01

+0

這篇博文是關於將匿名委託分配給一個類型爲'Delegate'的變量,它並沒有說'delegate'關鍵字不能用這種方式。 – svick 2014-09-23 15:53:42

回答

0
public class Database 
{ 
} 

public class DbCommand 
{ 
} 

public delegate void AssignParameter(Database db, DbCommand cmd); 

… 

AssignParameter ap = delegate(Database db, DbCommand cmd) 
{ 
}; 

這段代碼對我來說很好,所以一定還有別的事情要做。你確定兩套DatabaseDbCommand是指相同的類型嗎?而且委託內的代碼本身是有效的?

1

您在方法中使用的參數類型之一指的是與委託人定義的不同類型,如錯誤所述。

這意味着或者,與您發佈的代碼不同,您的實際代碼在其中一個位置使用不同類型,或者對於其中一個/兩個具有相同名稱的參數在不同名稱空間中使用多個類型。