2010-07-18 16 views
6

ACTUALIZACIÓN: He presentado esto como an issue on Microsoft Connect si puede reproducir esto y/o me gustaría ver esto solucionado, ayude a votar el problema allí.¿La compilación falla si las definiciones de delegado se ponen en otro proyecto?


He estado tratando de resolver este problema durante horas.
Realmente agradecería cualquier idea/consejo que pueda pensar.

Antes que nada, tengo 3 archivos Class.csDefinitions.cs y Program.cs. He pegado el contenido del archivo en http://pastie.org/1049492 para que lo pruebes.

El problema es que, si tiene TODOS los 3 archivos en el mismo proyecto de aplicación de consola. La aplicación se compila y funciona perfectamente.

Sin embargo, si tengo Class.cs y Definitions.cs en un proyecto de "biblioteca" que se hace referencia a partir del proyecto de aplicación de consola principal, que tiene sólo el archivo Program.cs, compilación falla con:

  • Delegado Act no lo hace tomar 2 argumentos
  • no puede convertir la expresión lambda para delegar tipo 'DC.Lib.Produce' porque algunos de los tipos de retorno en el bloque no son convertir implícitamente al tipo de retorno delegado ...

Aquí es una solución completa con 3 proyectos - 1 con todos los archivos combinados juntos y otra con las definiciones puestas en otro proyecto:
http://dl.dropbox.com/u/149124/DummyConsole.zip

estoy usando VS2010 edición RTW profesional.

Respuesta

8

Interesante. I piensa ha encontrado un error real en el compilador de C#, aunque me puede estar perdiendo algo sutil. He escrito una versión ligeramente simplificada que evita la sobrecarga de posibilidades etc entran en juego, y que prescinde del método extra:

// 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."); 
    }  
} 

Demostración de la compilación como un conjunto, sin errores:

> csc Test.cs Definitions.cs 

demostración de la compilación de sus dos conjuntos de errores:

> 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 

no puede pensar en cualquier razón por qué esto debería ser diferente en diferentes asambleas, ya que todo es público. La especificación rara vez se refiere a límites de ensamblaje distintos de internal.

Curiosamente, me sale el mismo error para los compiladores C# 3 y 4.

Envío por correo electrónico Eric y Mads ahora ...

EDIT: Tenga en cuenta que puede evitar esto usando una lista de parámetros explícita.Por ejemplo, en mi código de ejemplo, esto va a funcionar:

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

¡Gracias! Esperando impacientemente por más comentarios ... Espero no tener que volver a 3.5 solo por este TT – chakrit

+1

@chakrit: He puesto una solución, pero no veo cómo volver a .NET 3.5 ayudaría usted - como digo, he visto el mismo problema con el compilador C# 3. –

+0

Estoy reescribiendo/refacturando una biblioteca que funcionó bien en 3.5 para utilizar las nuevas cosas de .NET 4.0 ... Creo que debo haber tropezado algunos cables en el proceso. – chakrit

1

Me resolvieron mediante el cambio de nombre de C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Microsoft.CSharp.targets (no lo hacen ¡elimínelo!) que es una advertencia en la ventana de salida. El nuevo proyecto funciona bien ahora pero el anterior no se pudo cargar. Después de eso, cambié el nombre del archivo a su nombre original. Ahora ambos proyectos se pueden compilar sin errores. Esta es una solución empírica, pero espero que ayude

Cuestiones relacionadas