Поделиться через


Критические изменения в Razor после .NET 9.0.100 до .NET 10.0.100

В этом документе перечислены известные критические изменения в Razor после общего выпуска .NET 9 (пакет SDK для .NET версии 9.0.100) до общего выпуска .NET 10 (пакет SDK для .NET версии 10.0.100).

Разрывы анализа директив препроцессора

Представлено в VS 17.13p1 и .NET 9.0.200

Новый режим лексирования был представлен для понимания разделов C# в файлах razor, которые повышают совместимость с тем, как C# изначально лексируется. Однако это также приводит к некоторым критическим изменениям в понимании компилятора Razor директив предварительной обработки C#, которые ранее не работали последовательно. Директивы теперь необходимы для начала строки в файлах Razor (до них разрешено только пробелы). Кроме того, отключенные разделы теперь должным образом отключены компилятором Razor, когда #if блоки препроцессора считаются неактивными.

Блоки препроцессора должны начинаться в начале строки.

@{ #if DEBUG /* Previously allowed, now triggers RZ1043 */ }
<div>test</div>
@{ #endif /* Previously allowed, now triggers RZ1043 */ }

Чтобы исправить эту проблему, переместите директивы в новую строку. До директивы разрешено только пробелы.

@{
#if DEBUG /* This is allowed */
}
<div>test</div>
@{
    #endif /* This is allowed */
}

Отключенные блоки теперь считаются должным образом в компиляторе Razor

Отключенные блоки теперь считаются полностью отключенными компилятором Razor, и попытка понять блок не выполняется. При сочетании с предыдущим разрывом это означает, что если #else#elifстрока или #endif не была в начале строки (пробелы в модуле), более крупный раздел файла будет считаться отключенным, чем в более ранних версиях компилятора Razor. Чтобы помочь диагностировать потенциальные разрывы здесь, компилятор Razor сканирует отключенные текстовые разделы для потенциальных неуместных директив препроцессора и сообщить предупреждение, если обнаружен.

@{
#if false
}

This area is now properly considered disabled by the razor compiler, and no attempt to understand it as either C# or HTML is made. This
can cause changes to how the output is rendered from previous versions of the Razor compiler.

@{ #else
    In previous versions of the Razor compiler, this directive would have been picked up. It is no longer picked up because it is not at
    the start of a line. The Razor compiler will report a warning, RZ1044, to help diagnose any potential breaks in this area.
}

@{
#endif
}