yield nada

27/04/2005 - 16:38 por Alfredo Novoa | Informe spam
Hola,

Tengo un pequeño problema con los iteradores.

Tengo muchas clases que implementan IEnumerable<T> y una de ellas
representa al conjunto vacío y siempre tiene 0 elementos, por lo que
GetEnumerator debería de implementarse así:

public override IEnumerator<Value> GetEnumerator()
{
}

Pero esto no compila y en su lugar tengo que hacer algo como esto:

public override IEnumerator<Value> GetEnumerator()
{
if (false)
yield return null;
}

Que es una clara chapuza pero funciona perfectamente.


¿A alguien se le ocurre una solución mejor?

Y no me vale que me digais que no use una clase colección que siempre
tiene 0 elementos.


Saludos y gracias anticipadas.

Preguntas similare

Leer las respuestas

#1 Octavio Hernandez
27/04/2005 - 18:17 | Informe spam
Alfredo,

Creo que en ese caso lo adecuado es poner

yield break;

en el cuerpo del método.

Sorprendente tu manera de engañar al compilador con el if (false) etc.
¿Compila eso? En mi installación (C# Express Beta 1) no compila. Si tienes
la beta 2 y eso compila habría que reportarlo a MS!

Slds,

Octavio
"Alfredo Novoa" escribió en el mensaje
news:

Hola,

Tengo un pequeño problema con los iteradores.

Tengo muchas clases que implementan IEnumerable<T> y una de ellas
representa al conjunto vacío y siempre tiene 0 elementos, por lo que
GetEnumerator debería de implementarse así:

public override IEnumerator<Value> GetEnumerator()
{
}

Pero esto no compila y en su lugar tengo que hacer algo como esto:

public override IEnumerator<Value> GetEnumerator()
{
if (false)
yield return null;
}

Que es una clara chapuza pero funciona perfectamente.


¿A alguien se le ocurre una solución mejor?

Y no me vale que me digais que no use una clase colección que siempre
tiene 0 elementos.


Saludos y gracias anticipadas.

Respuesta Responder a este mensaje
#2 Alfredo Novoa
27/04/2005 - 18:28 | Informe spam
On Wed, 27 Apr 2005 18:17:03 +0200, "Octavio Hernandez"
wrote:

Alfredo,

Creo que en ese caso lo adecuado es poner

yield break;



Muchas gracias, es justo lo que quería. Imaginaba que habría algo así,
pero no lo encontraba.

Sorprendente tu manera de engañar al compilador con el if (false) etc.
¿Compila eso? En mi installación (C# Express Beta 1) no compila. Si tienes
la beta 2 y eso compila habría que reportarlo a MS!



Que raro, a mi me compila perfectamente con la Beta 1, eso si, me da
un aviso de que hay codigo que no se ejecuta nunca.

La Beta 2 la he tenido que desinstalar por que me cascaba todo el
rato. Yo creo que puede ser por que la Beta 1 no se desinstala bien,
aun no he probado la Beta 2 sobre un ordenador "limpio".

Otra cosa es que al volver a instalar la Beta 1 los "code snippets"
han dejado de funcionar.


Saludos
Respuesta Responder a este mensaje
#3 Octavio Hernandez
27/04/2005 - 18:47 | Informe spam
Alfredo,

A mí yield return null me da error; me dice que null no vale porque el tipo
genérico podría ser un tipo-valor, y que debo sustituirlo por default(T).

Slds - Octavio

"Alfredo Novoa" escribió en el mensaje
news:
On Wed, 27 Apr 2005 18:17:03 +0200, "Octavio Hernandez"
wrote:

Alfredo,

Creo que en ese caso lo adecuado es poner

yield break;



Muchas gracias, es justo lo que quería. Imaginaba que habría algo así,
pero no lo encontraba.

Sorprendente tu manera de engañar al compilador con el if (false) etc.
¿Compila eso? En mi installación (C# Express Beta 1) no compila. Si tienes
la beta 2 y eso compila habría que reportarlo a MS!



Que raro, a mi me compila perfectamente con la Beta 1, eso si, me da
un aviso de que hay codigo que no se ejecuta nunca.

La Beta 2 la he tenido que desinstalar por que me cascaba todo el
rato. Yo creo que puede ser por que la Beta 1 no se desinstala bien,
aun no he probado la Beta 2 sobre un ordenador "limpio".

Otra cosa es que al volver a instalar la Beta 1 los "code snippets"
han dejado de funcionar.


Saludos


Respuesta Responder a este mensaje
#4 Alfredo Novoa
27/04/2005 - 18:58 | Informe spam
On Wed, 27 Apr 2005 18:47:33 +0200, "Octavio Hernandez"
wrote:

Alfredo,

A mí yield return null me da error; me dice que null no vale porque el tipo
genérico podría ser un tipo-valor, y que debo sustituirlo por default(T).



¡Ah, claro!

Es que yo estoy usando un tipo referencia al crear el IEnumerable<T>

Por eso no me da error.


Saludos
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida