2010-07-18 12 views
6

UPDATE: Ho archiviato questo come an issue on Microsoft Connect se è possibile riprodurre questo e/o mi piacerebbe vedere questo risolto per favore contribuire a votare il problema laggiù.La compilazione non riesce se le definizioni dei delegati vengono inserite in un altro progetto?


Ho cercato di risolvere questo problema per ore.
Apprezzerebbe davvero qualsiasi idea/consiglio che si possa pensare.

Prima di tutto, ho 3 file Class.csDefinitions.cs e Program.cs. Ho incollato il contenuto del file al http://pastie.org/1049492 per provarlo.

Il problema è che, se si dispone di TUTTI i 3 file nello stesso progetto di applicazione console. L'applicazione compila e funziona bene.

Se, tuttavia, ho Class.cs e Definitions.cs in un progetto di "libreria", che fa riferimento a dal progetto di applicazione console principale che ha solo il file Program.cs, la compilazione fallisce con:

  • delegato Act non lo fa prendere 2 argomenti.
  • Non è possibile convertire un'espressione lambda a delegare tipo 'DC.Lib.Produce' perché alcuni dei tipi di ritorno nel blocco non sono conversione implicita nel tipo di ritorno delegato ...

Ecco una soluzione completa con 3 progetti - 1 con tutti i file combinate insieme e un altro con le definizioni messi in un altro progetto:
http://dl.dropbox.com/u/149124/DummyConsole.zip

sto usando edizione VS2010 RTW professionale.

risposta

8

Interessante. I penso che tu abbia trovato un bug reale nel compilatore C# - sebbene possa mancare qualcosa di sottile. Ho scritto una versione leggermente semplificata che permette di evitare le possibilità di sovraccarico ecc che entrano in gioco, e che dispensa con il metodo in più:

// Definitions.cs 
public interface IData { } 
public delegate IData Foo(IData input); 
public delegate IData Bar<T>(IData input, T extraInfo); 
public delegate Foo Produce<T>(Bar<T> next); 

// Test.cs 
class Test 
{ 
    static void Main() 
    { 
     Produce<string> produce = 
      next => input => next(input, "This string should appear."); 
    }  
} 

Dimostrazione di compilazione come uno di montaggio, senza errori:

> csc Test.cs Definitions.cs 

Dimostrazione di compilazione da due impianti con errori:

> csc /target:library Definitions.cs 
> csc Test.cs /r:Definitions.dll 

Test.cs(5,43): error CS1662: Cannot convert lambda expression 
     to delegate type 'Produce<string>' 
     because some of the return types in the block are not 
     implicitly convertible to the delegate return type 
Test.cs(5,52): error CS1593: Delegate 'Bar' does not take 2 arguments 

non riesco a pensare a qualsiasi ragione perché questo dovrebbe essere diverso tra i diversi gruppi, poiché tutto è pubblico. Le specifiche raramente parlano di limiti di assemblaggio diversi dai motivi internal.

È interessante notare che ottengo lo stesso errore per entrambi i compilatori C# 3 e 4.

Emailing Eric e Mads ora ...

EDIT: Si noti che è possibile aggirare questo utilizzando un elenco di parametri esplicito.Ad esempio, nel mio codice di esempio, questo funzionerà:

Produce<string> produce = 
    (Bar<string> next) => input => next(input, "This string should appear."); 
+0

Grazie! Aspettando con impazienza più feedback ... speriamo di non dover tornare a 3.5 solo per questo TT – chakrit

+1

@chakrit: ho messo in atto una soluzione alternativa, ma non vedo come tornare a .NET 3.5 sarebbe d'aiuto tu - come ho detto, ho visto lo stesso problema con il compilatore C# 3. –

+0

Sto riscrivendo/refactoring una libreria che ha funzionato bene in 3.5 per utilizzare nuove roba .NET 4.0 .... Credo che devo aver inciampato alcuni fili nel processo. – chakrit

1

ho risolto il problema, rinomina di C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Microsoft.CSharp.targets (non lo fanno cancellalo!) che è un avviso nella finestra di output. Il nuovo progetto funziona bene ma non è stato possibile caricare il precedente. Successivamente ho rinominato il file con il suo nome originale. Ora entrambi i progetti possono essere compilati senza errori. Questa è una soluzione empirica ma spero che aiuti

Problemi correlati