2014-11-21 35 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)後,缺少組裝參考的錯誤變得可見。

相關問題