Невозможно создать временный класс (результат =1). Ошибка CS0030: не удается преобразовать тип "Тип []" в "Тип"?

Я получаю эту ошибку после создания класса из моего файла xsd с помощью инструмента xsd.exe. Поэтому я искал в сети и нашел решение. Вот ссылка: http://satov.blogspot.com/2006/12/xsdexe-generated-classes-causing.html

Проблема в том, что это заставляет код работать, но десериализованные данные почему-то кажутся поврежденными. Я сделал то, что предлагает сайт, и, в конце концов, 2-е измерение массива всегда пусто (см. Комментарии сайта, у кого-то тоже была эта проблема). Вопрос в том, как мне решить эту проблему сейчас? Есть ли другой инструмент для создания файла xsd? Я попробовал Xsd2Code, но безуспешно.

Спасибо:-)

8 ответов

Вам необходимо изменить тип переменной-члена в сериализованном классе. Например, если возникает ошибка вроде:

Невозможно создать временный класс (результат =1). ошибка CS0030: невозможно преобразовать тип "Данные []" в "Данные".

Я запустил поиск по имени типа данных в сгенерированном файле, и я нашел это:

[System.Xml.Serialization.XmlArrayItemAttribute("Data", typeof(Data), IsNullable=false)]
public Data[][] Row

замещать Data[][] с Data[] - Измените тип данных из 2D-массива в 1D-массив. Это решило бы вашу проблему.:)

Была такая же проблема, но Xsd2Code не интегрировался с VS2012. Так что вместо этого я пошел к моему xsd.exe сгенерированному файлу.cs и сделал:

Найти [][] Заменить []

который работал.

Я получил эту ошибку. В вашем решении в этом файле есть файл reference.cs, в котором вам нужно выполнить поиск "[][]", и тогда в нем будет два результата..

После того, как вам нужно удалить один "[]" из "[][]" из обоих мест..

Меня устраивает..

Спасибо..

Добавлять <xs:attribute name="tmp" type="xs:string" /> после каждого
<xs:sequence maxOccurs="unbounded"> <xs:element ../> </xs:sequence>
а также
<xs:sequence> <xs:element maxOccurs="unbounded"/> </xs:sequence>
элемент в файле схемы, если вы не хотите потерять размерность массива.

Для меня это помогает исправлять XML, используемый для генерации кода. Это происходит, когда:

<Names>
    <Name></Name>
    <Name></Name>
</Names>

тогда это оптимизируется с помощью xsd для двойной записи имени массива

Что я сделал, это:

<Names>
    <Dummy></Dummy>
    <Name></Name>
    <Name></Name>
</Names>

XSD не оптимизирует его, но оставляет одно имя массива

Если это в VB.net, то вы должны искать ()() в вашем Reference.vb и заменить на ()

Это действительно ответ @WaldemarGałęzinowski /questions/7179743/nevozmozhno-sozdat-vremennyij-klass-rezultat-1-oshibka-cs0030-ne-udaetsya-preobrazovat-tip-tip-v-tip/7179756#7179756 , немного расширенный.

имеет оптимизацию, которая срабатывает, когда у вас есть один неограниченный элемент без атрибута в последовательности.

Оптимизация позволит избежать создания специального типа для родителя, а вместо этого сделает его массивом дочерних элементов.

ChildType[] Parent { get; set; }вместо ParentType Parent { get; set; }и вы получаете доступ к детям, как Parent[0]вместо Parent.Child[0]. (иногда я нахожу эту оптимизацию немного запутанной)

Здесь происходит то, что у вас есть еще один уровень неограниченного элемента без атрибутов.

Оптимизация применяется дважды, и результат GrandChildType[][] Parent {get; set;}и вы получаете доступ к своемулюбимыйкак первый внук Parent[0][0]вместо Parent.Child[0].GrandChild[0].

Проблема в том, что сериализатор .Net не поддерживает массивы массивов и генерирует неверный код.

Я понятия не имею, почему Microsoft не исправила эту ошибку все эти годы, но обходной путь прост.

Просто сила xsd.exeчтобы сгенерировать класс для родителя или дочернего элемента, добавив в последовательность необязательный атрибут или необязательный элемент. например

Что приводит к Parent[0].GrandChild[0]

В моем случае проблема возникает из-за неправильного объявления атрибута свойства XmlArrayItem.

От

[XmlArrayItem("MyArray", typeof(string))]
public List<ClassName> Items{ get; set; }

Я изменил с соответствующим типом: от строки до ClassName

[XmlArrayItem("MyArray", typeof(ClassName))]
public List<ClassName> Items{ get; set; }

Надеюсь это поможет!

Другие вопросы по тегам