почему я не могу конвертировать из 'System.IO.StreamWriter' в 'CsvHelper.ISerializer'?

9

Пытаясь записать содержимое людей в CSV-файл и затем экспортировать его, однако я получаю ошибку сборки и ее сбой. ошибка:

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

Не уверен, почему это происходит, если я не уверен, что сделал это таким образом множество раз.

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);
        }
    }
}
Энди Став
источник
Не могли бы вы пояснить , почему вы думаете , что вы должны быть в состоянии конвертировать StreamWriterв ISerializer? StreamWriterявляется частью самого .NET - он не может реализовывать интерфейсы из определенного стороннего пакета.
Джон Скит
1
Это говорит о том, что CsvHelper.CsvWriter(TextWriter)это не входит в сферу. Дважды проверьте, что вы получаете правильную версию пакета, и это StreamWriterобычный класс ( System.IO.StreamWriter). Используйте «Перейти к определению», CsvWriterчтобы перепроверить.
Йерун Мостерт
@JeroenMostert Вы хотели проверить csvWriter? я сделал, и он принадлежит к классу CSVhelper, который использует использование CsvHelper.Configuration; using CsvHelper.TypeConversion; используя Систему; использование System.Collections; using System.Collections.Generic; используя System.Dynamic; используя System.Globalization; использование System.IO; использование System.Threading.Tasks;
Энди Став
Да, но компилятор говорит вам, что он вызывает CsvWriterконструктор, который принимает ISerializer, и терпит неудачу, поскольку нет преобразования. Он должен был выбрать CsvWriterконструктор, который принимает TextWriter, поскольку StreamWriterнаследует от него, так что либо этот конструктор отсутствует (по какой-либо причине), либо разрешение перегрузки компилятора нарушено (немного менее вероятно, но произошли более странные вещи).
Йерун Мостерт

Ответы:

29

Произошло серьезное изменение в версии 13.0.0. Было много проблем с локализацией, поэтому @JoshClose требует от пользователей указывать, что CultureInfoони хотят использовать. Теперь вам нужно включить CultureInfoпри создании CsvReaderи 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);
        }
    }
}

Примечание: CultureInfo.CurrentCulture был по умолчанию в предыдущих версиях.

Рассматривать

  • CultureInfo.InvariantCulture- Если вы контролируете как запись, так и чтение файла. Таким образом, он будет работать независимо от того, какую культуру использует пользователь на своем компьютере.
  • CultureInfo.CreateSpecificCulture("en-US")- Если вам это нужно, чтобы работать для определенной культуры , независимо от культуры пользователя.
Дэвид Спехт
источник
Вы сэкономили мне много времени, спасибо, Дэвид * работает на v15.0.0
Константин Маликов