Dlaczego nie mogę przekonwertować z „System.IO.StreamWriter” na „CsvHelper.ISerializer”?

9

Próbuję zapisać zawartość osób w pliku CSV, a następnie wyeksportować go, jednak pojawia się błąd kompilacji i jego błąd. błąd jest następujący:

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

Nie jestem pewien, dlaczego tak się dzieje, chyba że jestem pewien, że robiłem to w ten sposób wiele razy.

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
źródło
Czy mógłby Pan wyjaśnić, dlaczego uważasz, że powinien być w stanie przekonwertować z StreamWriterdo ISerializer? StreamWriterjest częścią samego .NET - nie może implementować interfejsów z określonego pakietu innej firmy.
Jon Skeet
1
Sugeruje CsvHelper.CsvWriter(TextWriter)to, że nie jest objęty zakresem. Dokładnie sprawdź, czy otrzymujesz odpowiednią wersję pakietu, i to StreamWriterjest zwykła klasa ( System.IO.StreamWriter). Użyj „Idź do definicji”, CsvWriteraby dwukrotnie sprawdzić.
Jeroen Mostert
@JeroenMostert miałeś na myśli sprawdzenie csvWriter? zrobiłem i należy do klasy CSVhelper, która używa CsvHelper.Configuration; using CsvHelper.TypeConversion; using System; using System.Collections; using System.Collections.Generic; using System.Dynamic; using System.Globalization; using System.IO; using System.Threading.Tasks;
Andy Stav
Tak, ale kompilator mówi ci, że wywołuje CsvWriterkonstruktor, który pobiera ISerializeri kończy się niepowodzeniem, ponieważ nie ma konwersji. Powinien był wybrać CsvWriterkonstruktor, który bierze TextWriter, ponieważ StreamWriterdziedziczy po tym, więc albo tego konstruktora brakuje (z jakiegokolwiek powodu), albo rozdzielczość przeciążenia kompilatora jest zepsuta (trochę mniej prawdopodobne, ale dziwniejsze rzeczy się zdarzyły).
Jeroen Mostert

Odpowiedzi:

29

Nastąpiła przełomowa zmiana w wersji 13.0.0. Wystąpiło wiele problemów z lokalizacją, więc @JoshClose wymaga od użytkowników określenia, CultureInfoktórego chcą użyć. Musisz teraz uwzględnić CultureInfoprzy tworzeniu CsvReaderi 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);
        }
    }
}

Uwaga: CultureInfo.CurrentCulture był domyślny w poprzednich wersjach.

Rozważać

  • CultureInfo.InvariantCulture- Jeśli kontrolujesz zarówno zapis, jak i odczyt pliku. W ten sposób będzie działać bez względu na kulturę użytkownika na swoim komputerze.
  • CultureInfo.CreateSpecificCulture("en-US")- Jeśli potrzebujesz, aby działał dla określonej kultury , niezależnie od kultury użytkownika.
David Specht
źródło
zaoszczędziłeś mi dużo czasu, dzięki, David * pracuje dla v15.0.0
Konstantin Malikov