¿Por qué no puedo convertir 'System.IO.StreamWriter' a 'CsvHelper.ISerializer'?

9

Intento escribir el contenido de las personas en un archivo CSV y luego exportarlo, sin embargo, recibo un error de compilación y falla. el error es:

cannot convert from 'System.IO.StreamWriter' to 'CsvHelper.ISerializer'

No estoy seguro de por qué sucede esto a menos que esté seguro de que lo he hecho de esta manera muchas veces.

private void ExportAsCSV()
{
    using (var memoryStream = new MemoryStream())
    {
        using (var writer = new StreamWriter(memoryStream))
        {
            using (var csv = new CsvHelper.CsvWriter(writer))
            {
                csv.WriteRecords(people);
            }

            var arr = memoryStream.ToArray();
            js.SaveAs("people.csv",arr);
        }
    }
}
Andy Stav
fuente
¿Podría aclarar por qué cree que debería poder convertir de StreamWritera ISerializer? StreamWriteres parte de .NET en sí mismo: no puede implementar interfaces desde un paquete de terceros específico.
Jon Skeet
1
Esto sugiere CsvHelper.CsvWriter(TextWriter)que no está en el alcance. Verifique que esté obteniendo la versión correcta del paquete, y esa StreamWriteres la clase habitual ( System.IO.StreamWriter). Use "Ir a definición" CsvWriterpara verificar dos veces.
Jeroen Mostert
@JeroenMostert, ¿querías comprobar csvWriter? lo hice y pertenece a la clase CSVhelper que usa CsvHelper.Configuration; usando CsvHelper.TypeConversion; utilizando el sistema; usando System.Collections; usando System.Collections.Generic; usando System.Dynamic; usando System.Globalization; usando System.IO; usando System.Threading.Tasks;
Andy Stav
Sí, pero lo que el compilador le está diciendo es que está invocando al CsvWriterconstructor que toma un ISerializer, y falla ya que no hay conversión. Debería haber elegido el CsvWriterconstructor que toma un TextWriter, ya que StreamWriterhereda de eso, por lo que falta ese constructor (por cualquier razón) o la resolución de sobrecarga del compilador está rota (un poco menos probable, pero han sucedido cosas más extrañas).
Jeroen Mostert

Respuestas:

29

Hubo un cambio importante con la versión 13.0.0. Ha habido muchos problemas con la localización, por lo que @JoshClose requiere que los usuarios especifiquen lo CultureInfoque desean usar. Ahora debe incluir CultureInfoal crear CsvReadery CsvWriter. https://github.com/JoshClose/CsvHelper/issues/1441

private void ExportAsCSV()
{
    using (var memoryStream = new MemoryStream())
    {
        using (var writer = new StreamWriter(memoryStream))
        {
            using (var csv = new CsvHelper.CsvWriter(writer, System.Globalization.CultureInfo.CurrentCulture)
            {
                csv.WriteRecords(people);
            }

            var arr = memoryStream.ToArray();
            js.SaveAs("people.csv",arr);
        }
    }
}

Nota: CultureInfo.CurrentCulture era el valor predeterminado en versiones anteriores.

Considerar

  • CultureInfo.InvariantCulture- Si controla tanto la escritura como la lectura del archivo. De esa manera funcionará sin importar la cultura que tenga el usuario en su computadora.
  • CultureInfo.CreateSpecificCulture("en-US")- Si necesita que funcione para una cultura particular , independiente de la cultura del usuario.
David Specht
fuente
me ahorraste mucho tiempo, gracias, David * trabaja para v15.0.0
Konstantin Malikov