tutorial - C#: ¿Sin conversión implícita entre ''expresión lambda'' y ''expresión lambda''?
linq lambda c# (1)
El tipo de expresión condicional debe inferirse como un todo, y las expresiones lambda siempre deben convertirse a un delegado específico o tipo de árbol de expresión.
En sus dos últimos ejemplos, el compilador sabe a qué intenta convertir la expresión lambda. En el primer ejemplo, primero intenta resolver el tipo de expresión condicional completa.
Sin embargo, un elenco en una de las ramas sería suficiente:
protected override Func<Stream> GetStream()
{
return someBool
? (Func<Stream>)
(() => EmbeddedResourceExtractor.GetFile("SomeFile1.ext"))
: () => EmbeddedResourceExtractor.GetFile("SomeFile2.ext");
}
La solución de Sergio (ahora eliminada, pero incluida a continuación) funcionará si usted está contento de evaluar someBool
en el momento en que se llama a la función:
protected override Func<Stream> GetStream()
{
return () => someBool
? EmbeddedResourceExtractor.GetFile("SomeFile1.ext")
: EmbeddedResourceExtractor.GetFile("SomeFile2.ext");
}
Dependiendo del tiempo, hay todo tipo de formas diferentes de corregir el ejemplo que en realidad has dado, por ej.
protected override Func<Stream> GetStream()
{
string name = someBool ? "SomeFile1.ext" : "SomeFile2.ext";
return () => EmbeddedResourceExtractor.GetFile(name);
}
Supongo que tu código real es más complicado.
Es una pena en cierto modo que la inferencia de C # no sea más poderosa, pero ya es bastante complicada.
Esta pregunta ya tiene una respuesta aquí:
El tipo de expresión condicional no se puede determinar porque no hay una conversión implícita entre ''expresión lambda'' y ''expresión lambda''
Decir whaat? ¿Podría alguien explicarme este error de compilación? Este es el código que lo produce:
protected override Func<System.IO.Stream> GetStream()
{
return someBool
? () => EmbeddedResourceExtractor.GetFile("SomeFile1.ext")
: () => EmbeddedResourceExtractor.GetFile("SomeFile2.ext");
}
Esto no lo hace:
protected override Func<System.IO.Stream> GetStream()
{
return () => EmbeddedResourceExtractor.GetFile("SomeFile1.ext");
}
Y tampoco hacer esto:
protected override Func<System.IO.Stream> GetStream()
{
if(someBool)
return () => EmbeddedResourceExtractor.GetFile("SomeFile1.ext");
return () => EmbeddedResourceExtractor.GetFile("SomeFile2.ext");
}