2011-02-26 11 views
8

sólo estoy pidiendo esto, debido a que la misma pasó a mí cuando se trata de repetir un DataRowCollection:¿Se actualizó el código antiguo de .NET en nuevas versiones?

DataSet s; 
... 
foreach (var x in s.Tables[0].Rows) 
{ 
    //IntelliSense doesn't work here. It takes 'x' as an object. 
} 

vi respuesta @Marc Gravell en Why is there no Intellisense with 'var' variables in 'foreach' statements in C#?, y ahora es claro para mí por qué ocurre esto.

yo decidimos tomar un vistazo al código de la clase DataRowCollection y GetEnumerator() es:

return this.list.GetEnumerator(); 

donde list es un tipo DataRowTree que hereda la clase abstracta RBTree<K> (por cierto, no sabía que era una implementación de un Árbol Rojo-Negro en .NET antes de) que implementa IEnumerable en lugar de IEnumerable<K>.

¿Es demasiado difícil hacer RBTree<K> implementar IEnumerable<K>? Eso resolvería el problema principal aquí.

Supongo que fue desarrollado así en versiones anteriores de .NET, pero eso ya no tiene sentido, ¿o sí?

Mi pregunta es:

se actualiza viejo código .NET en las nuevas versiones? (por ejemplo, hacer DataRowCollection implemento IEnumerable<DataRow> en lugar de IEnumerable)

+0

Umm, estoy casi seguro de que * no hay * una clase 'RBTree ' en .NET Framework. [Creo que Java tiene uno] (http://net0.datastructures.net/doc4/net/datastructures/RBTree.html), pero no está en BCL. ¿De dónde sacas eso? –

+1

@Cody Es * interno * y está bajo el espacio de nombres 'System.Data'. El reflector te dirá esto. Primero tenía dudas sobre esto, pero también tiene un * enum * 'NodeColor'. ¿Me equivoco? –

+0

** Downvoter **: ¿Podría dejar un comentario, por favor? –

Respuesta

6

cambios Romper, tales como el cambio de la jerarquía de clases, sólo se implementa si hay una buena razón. En este caso, es solo por conveniencia.

Un ejemplo de por qué es un cambio de rotura: Digamos que un proyecto tiene estos dos métodos.

public void Foo(object obj){ 
    Console.WriteLine(obj.ToString(); 
} 

public void Foo<T>(IEnumerable<T> obj){ 
    throw new Exception(); 
} 

ahora el cambio que uno quiere hacer un programa que se ha vuelto a compilar pero no cambió lanzar una excepción cada vez que en lugar de imprimir a la consola. No es que arroje ese es el problema sino que el comportamiento es diferente.

Hay otras maneras en que un cambio podría romper o alterar un programa perfectamente bueno, por lo que los beneficios (poder escribir var en bucles foreach) no superan el costo (diseño, implementación, prueba, documentación) ni los costos potenciales de romper el trabajo de los clientes.

+0

Gracias por su respuesta;) –

Cuestiones relacionadas