Невозможно создать временный класс (результат =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; }
Надеюсь это поможет!