Các thay đổi phá vỡ tương thích trong Razor compiler (trình biên dịch Razor) kể từ .NET 9
Tài liệu này liệt kê các thay đổi phá vỡ tương thích đã biết trong Razor sau phiên bản phát hành chính thức .NET 9 (phiên bản .NET SDK 9.0.100) cho đến phiên bản phát hành chính thức .NET 10 (phiên bản .NET SDK 10.0.100).
Phân tích cú pháp chỉ thị tiền xử lý (preprocessor directive) bị thay đổi
Được giới thiệu trong VS 17.13p1 và .NET 9.0.200
Một chế độ lexing (phân tích từ vựng) mới đã được giới thiệu để hiểu các phần C# trong file Razor, mang lại khả năng tương thích cao hơn với cách C# được lexing natively. Tuy nhiên, điều này cũng mang lại một số thay đổi phá vỡ tương thích đối với cách Razor compiler hiểu các chỉ thị tiền xử lý C#, vốn trước đây không hoạt động nhất quán. Các chỉ thị hiện yêu cầu phải bắt đầu ở đầu dòng trong file Razor (chỉ được phép có khoảng trắng trước chúng). Ngoài ra, các phần bị vô hiệu hóa hiện được Razor compiler xử lý đúng cách khi các khối #if tiền xử lý được coi là không hoạt động.
Các khối tiền xử lý phải bắt đầu ở đầu dòng
@{ #if DEBUG /* Trước đây được phép, nay kích hoạt RZ1043 */ }
<div>test</div>
@{ #endif /* Trước đây được phép, nay kích hoạt RZ1043 */ }Để khắc phục, hãy chuyển các chỉ thị sang một dòng mới. Chỉ được phép có khoảng trắng trước chỉ thị.
@{
#if DEBUG /* Điều này được phép */
}
<div>test</div>
@{
#endif /* Điều này được phép */
}Các khối bị vô hiệu hóa hiện được xử lý đúng cách trong Razor compiler
Các khối bị vô hiệu hóa hiện được coi là hoàn toàn bị vô hiệu hóa bởi Razor compiler và không có nỗ lực nào để hiểu khối đó. Khi kết hợp với thay đổi trước, điều này có nghĩa là nếu một #else, #elif, hoặc #endif không ở đầu dòng (bỏ qua khoảng trắng), một phần lớn hơn của file sẽ được coi là bị vô hiệu hóa so với các phiên bản cũ hơn của Razor compiler. Để giúp chẩn đoán các vấn đề tiềm ẩn, Razor compiler sẽ quét các phần văn bản bị vô hiệu hóa để tìm các chỉ thị tiền xử lý bị đặt sai vị trí và báo cáo cảnh báo nếu tìm thấy.
@{
#if false
}
Khu vực này hiện được Razor compiler coi là hoàn toàn bị vô hiệu hóa và không có nỗ lực nào để hiểu nó là C# hay HTML. Điều này
có thể gây ra thay đổi trong cách đầu ra được render so với các phiên bản trước của Razor compiler.
@{ #else
Trong các phiên bản trước của Razor compiler, chỉ thị này sẽ được nhận diện. Nó không còn được nhận diện nữa vì nó không ở
đầu dòng. Razor compiler sẽ báo cáo một cảnh báo, RZ1044, để giúp chẩn đoán bất kỳ vấn đề tiềm ẩn nào trong khu vực này.
}
@{
#endif
}