ventajas tutorial expresiones español ejemplos c# lambda

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.

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