2014-11-21 36 views
1

我想在Mono上构建this repositoryPostgreSqlGeneration代码。不幸的是,我收到了一个我不明白的错误。代表System.Action <dynamic,int>不采用'1'参数

PostgreSqlMigrationSqlGenerator类中的以下方法给出了生成错误“代表System.Action不采取'1' 参数”:

private void GenerateStatements(IEnumerable<MigrationOperation> migrationOperations) 
{ 

    Check.NotNull(migrationOperations, "migrationOperations"); 
    DetectHistoryRebuild(migrationOperations).Each<dynamic>(o => Generate(o)); // <=here! 

} 

/编辑扩展方法的签名如下:

Signatures and error

/编辑2.下面是Generate方法的声明:

private void Generate(HistoryOperation migration) 
{ 
    //migration 

    Check.NotNull(migration, "historyOperation"); 

    using (var writer = Writer()) 
    { 
     migration.CommandTrees.Each(
      commandTree => 
      { 

       switch (commandTree.CommandTreeKind) 
       { 
        case DbCommandTreeKind.Insert: 


         writer.Write(GetInsertHistorySql((DbInsertCommandTree)commandTree)); 

         break; 
       } 
      }); 

     Statement(writer); 
    } 

} 

我不知道为什么发生这种情况,因为Each只有dynamic类型,没有整数。但我对这种lambda表达式没有经验。要了解更多信息并让迁移工作,我希望有人能够解释为什么会发生错误以及如何修复。

+0

@BradleyDotNET我把签名放在问题中。 – 2014-11-21 19:03:56

+0

好的谢谢。那么我不明白为什么它会要求一个'int'。 – BradleyDotNET 2014-11-21 19:05:58

+0

它似乎需要一个签名错误的扩展方法? – 2014-11-21 19:09:26

回答

1

声明:我觉得非常糟糕,我找不到任何东西,这解释了为什么这不起作用。如果有人知道;请告诉我。 Google在这里失败了。

显然,编译器为Each选择了错误的超载。图书馆有两个,一个需要Action<T>,另一个需要Action<T, int>

如果你不使用dynamic它会工作得很好(如果我不得不猜测);但dynamic会导致各种奇怪的问题; 您正在使用单声道。

由于编译器坚持使用其他重载,因此该解决方案足够简单。只要使用它!

DetectHistoryRebuild(migrationOperations).Each<dynamic>((o, i) => Generate(o)); 

您带了一个额外的参数,并没有使用它。它不是世界末日。

你也可以只明确实例化Action所以编译器不必选择:

DetectHistoryRebuild(migrationOperations).Each<dynamic>(new Action(o => Generate(o))); 
+0

谢谢。现在错误(在同一行)是'Delegate System.Func 不带'2'参数'... – 2014-11-21 19:27:38

+0

@ user2609980哇;糟透了就是你。请尝试我的新建议并直接实例化操作。 – BradleyDotNET 2014-11-21 19:30:03

+0

@ user2609980它应该是'Each ((o,i)=> ...)'。有一个泛型参数的'Each'有两个重载。具有两个通用参数的那个是你不感兴趣的超载。 – hvd 2014-11-21 19:30:25

0

的解决方案是增加的Microsoft.Csharp.dll缺少的程序集引用。出于某种原因,如BradleyDotNET在他的回答中所建议的那样,将lambda签名从i更改为(i,j)后,缺少组装参考的错误变得可见。

相关问题