XAML не скомпилируется, но без сообщения об ошибке, если пользовательский объект является первым ресурсом, за которым сразу следует ресурс x: Array

Я нахожу эту проблему очень странной, возможно, ошибка XAML / Visual Studio. Я надеюсь, что кто-то еще посчитает это менее странным и объяснит, почему то, что я делаю, неправильно, и / или лучший обходной путь, чем просто объявление ресурсов в другом порядке.

У меня есть этот простой XAML:

<Window x:Class="TestSOAskArrayXaml.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:system="clr-namespace:System;assembly=mscorlib"
        xmlns:local="clr-namespace:TestSOAskArrayXaml"
        Title="MainWindow" Height="350" Width="525">
  <Window.Resources>
    <local:A x:Key="a1"/>
    <x:Array x:Key="listBoxItems" Type="{x:Type system:Double}">
      <system:Double>0.25</system:Double>
    </x:Array>
  </Window.Resources>

  <Grid/>
</Window>

Когда я пытаюсь скомпилировать проект, я получаю следующую ошибку:

1> ... MainWindow.xaml.cs (25,13,25,32): ошибка CS0103: имя InitializeComponent не существует в текущем контексте

Я понимаю значение ошибки, но не понимаю, почему это происходит. XAML выглядит нормально, нет ошибок при его компиляции, но по какой-то причине автоматически сгенерированный файл .g.i.cs, гдеInitializeComponent() обычно помещается не создается и не используется (т. е. даже если файл существует из предыдущей успешной компиляции, он все еще не скомпилирован в сборку).

Если я просто поменяю порядок ресурсов, все будет работать нормально:

  <Window.Resources>
    <x:Array x:Key="listBoxItems" Type="{x:Type system:Double}">
      <system:Double>0.25</system:Double>
    </x:Array>
    <local:A x:Key="a1"/>
  </Window.Resources>

Дополнительная информация:

A любой класс в моем проекте. Для целей этого теста он был объявлен какclass A { }то есть пустой класс, но я впервые столкнулся с этой проблемой, помещая экземпляры конвертера в ресурсы.Если я использую встроенный тип вместоAнапример,<system:String x:Key="a1">Some string</system:String>, ошибки не бывает.Если я помещаю объект встроенного типа в качестве ресурса между пользовательским типомA объект и мой объект ресурса массива,тоже отлично работает!

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


Может кто-нибудь объяснить, почему это ожидаемое поведение (и что я должен делать, чтобы избежать его, кроме перестановки моих ресурсов), или подтвердить, что я не совсем сумасшедший, думая, что это ошибка в процессе сборки XAML?


Редактировать:

Учитывая вероятность того, что это настоящая ошибка, я пошел дальше и открыл отчет об ошибке подключения здесь:https://connect.microsoft.com/VisualStudio/feedback/details/1441123/xaml-fails-to-compile-without-error-if-user-defined-object-is-first-resource-and-followed-immediately- по-X-массив-ресурс

Смотрите также связанный / похожий вопрос переполнения стека:Имя InitializeComponent не существует в текущем контексте: странное поведение


Изменить № 2:

WPF обновил отчет Connect (см. Ссылку выше), заявив, что исправление ошибки будет выпущено в следующей версии .NET:

Написал Сачин [MSFT] 9.03.2016 в 15:53

Команда WPF рассмотрела эту проблему и исправила ее в следующей версии .NET. Мы благодарим вас за отзыв и считаем, что этот вопрос решен - команда WPF

Ответы на вопрос(0)

Ваш ответ на вопрос