Probe lo de no enviarlo por referencia y sige funcionando y la solucion que me diste se aplica exelente, te agradeceria si puedes ampliarme la informacion de lo que dijiste que un DataTable ya es un valor por referencia no e encontrado informacion valiosa al respecto y no se que otros tipos de variable son ya valores por referencia o no se si te entendi bien el caso es que funciono y agradesco la respuesta.
Gracias
todos los objetos que crees a partir de clases son pasados por referencia, los objetos que crees con tipos valor o con estructuras son pasados por valor salvo que lo indiques con la palabra clave ref... como lo estabas haciendo.
Un objeto creado a partir de una clase crea un area de memoria a la cual se llega a partir de un apuntador, que no es mas que una direccion de memoria que hace referencia a en donde quedo el objeto...
por ello los objetos creados a partir de clases son por referencia,
mientras que cosas como int, float, decimal, long y estructuras entre otros se crean en una parte de la memoria contigua de tu programa llamada stack, por ello para saber donde estan no se necesita una referencia a la memoria sino simplemente se sabe que están en alguna posicion de esa pequeña porción de memoria llamada stack para ello no necesitas referencia por tal se pasan por valor...
si haces un parametro ref de un DataTable ( el cual viene de una clase, por lo mismo ya esta por referencia ) lo que haces es crear una referencia ( o sea una direccion de memoria) que dice donde queda otra referencia que finalmente es la que si tiene la direccion de donde esta ubicado el objeto... entonces es doble vuelta y dado que la soble referencia solo existiria en el foreach (porque en C# las variables tienen scope local ) entonces te salia ese error.
en fin el tema en profundidad puede ser mas canzón de entender, pero lo basico es que aprendas a diferencia tipos por valor y tipos por referencia:
http://msdn.microsoft.com/es-es/library/ms173104.aspx