【问题标题】:Using delegate in an anonyous method in.net 4在.net 4中的匿名方法中使用委托
【发布时间】:2014-09-23 23:51:53
【问题描述】:

被赋予了将一些代码从 VS2005 编写的 .net 2 升级到使用 VS2010 的 .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);
         }
         ...
    }
}

所以我读过delegate关键字不能以那种方式使用

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

但仍然难以理解如何解决我的问题。

我试过了

  • 铸造委托
  • 创建一个新的 AssignParameter 调用,但问题是我没有可用的 Database 或 DbCommand 对象

您对如何解决此问题有任何建议吗?

【问题讨论】:

  • (db, cmd) =>替换delegate(Database db, DbCommand cmd)
  • @itsme86 他使用的语法没有问题。您的建议在功能上是等效的。
  • 那篇博文是关于将匿名委托分配给类型为 Delegate 的变量,它并没有说不能以这种方式使用 delegate 关键字。
  • 我刚刚尝试了 (db, cmd) =>,这似乎解决了我的问题。

标签: c# delegates


【解决方案1】:

如错误所述,您在方法中使用的参数类型之一指的类型与委托定义的类型不同。

这意味着,与您发布的代码不同,您的实际代码在其中一个位置使用不同的类型,或者您在不同的命名空间中为这些参数中的一个/两个具有相同名称的多个类型。

【讨论】:

    【解决方案2】:
    public class Database
    {
    }
    
    public class DbCommand
    {
    }
    
    public delegate void AssignParameter(Database db, DbCommand cmd);
    
    …
    
    AssignParameter ap = delegate(Database db, DbCommand cmd)
    {
    };
    

    这段代码对我来说编译得很好,所以肯定有其他事情发生。你确定DatabaseDbCommand这两组是指同一个类型吗?并且委托中的代码本身是有效的吗?

    【讨论】:

      猜你喜欢
      • 2010-11-01
      • 2010-11-01
      • 1970-01-01
      • 2011-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-24
      • 2011-05-25
      相关资源
      最近更新 更多