Tôi đã mở giải pháp của chúng tôi trong Visual Studio 2015 ngày hôm qua và một vài thử nghiệm đơn vị của chúng tôi (chạy tốt trong Visual Studio 2013) bắt đầu thất bại. Digger sâu hơn tôi phát hiện ra nó là bởi vì gọi GetTypes()
trên một hội đồng đã được trả lại kết quả khác nhau. Tôi đã có thể tạo ra một trường hợp thử nghiệm rất đơn giản để minh họa nó.Hành vi của Assembly.GetTypes() thay đổi trong Visual Studio 2015
Trong cả Visual Studio 2013 và 2015, tôi đã tạo ứng dụng bảng điều khiển mới bằng .NET Framework 4.5.2. Tôi đặt đoạn mã sau vào cả hai dự án.
class Program
{
static void Main(string[] args)
{
var types = typeof(Program).Assembly.GetTypes()
.Where(t => !t.IsAbstract && t.IsClass);
foreach (var type in types)
{
Console.WriteLine(type.FullName);
}
Console.ReadKey();
}
}
Khi tôi chạy trong Visual Studio 2013, tôi nhận được kết quả như sau (như mong đợi).
VS2013Example.Program
Khi tôi chạy trong Visual Studio 2015 tôi nhận được kết quả như sau (không như mong đợi).
VS2015Example.Program
VS2015Example.Program + <> c
Vì vậy, là những gì mà VS2015Example.Program+<>c
loại? Hóa ra đó là lambda bên trong phương thức .Where()
. Vâng, đúng vậy, bằng cách nào đó mà lambda địa phương đang được tiếp xúc như một loại. Nếu tôi nhận xét số .Where()
trong VS2015 thì tôi không còn nhận được dòng thứ hai đó nữa.
Tôi đã sử dụng Beyond Compare để so sánh hai tệp .csproj nhưng khác biệt duy nhất là số phiên bản VS, GUID của dự án, tên của không gian tên và lắp ráp mặc định và VS2015 có tham chiếu đến System.Net .Http mà VS2013 thì không.
Có ai khác nhìn thấy điều này không?
Có ai có giải thích về lý do tại sao biến cục bộ sẽ được hiển thị dưới dạng loại ở cấp hội đồng không?
Cảm ơn thông tin. Dường như một chút đáng sợ vì nó cảm thấy giống như một sự thay đổi có khả năng gây ra rất nhiều mã hiện có đang hoạt động tốt để đột nhiên xuất hiện lỗi. Trong những năm qua tôi đã mất số lần tôi đã viết mã liệt kê các loại trong một hội đồng. Cảm thấy như 'GetTypes()' có thể có một tình trạng quá tải cho phép nhà phát triển nói rõ ràng nếu họ muốn các loại trình biên dịch tạo ra được bao gồm. –
@CraigW. Nên khá dễ dàng để viết một phương pháp mở rộng cho điều đó nhưng tôi hoàn toàn đồng ý đó là một thay đổi phá vỡ tiềm năng bởi vì ngay cả với một phương pháp mở rộng nó sẽ không được gọi theo mặc định, có lẽ bạn nên gửi một vấn đề với đội Roslyn trên github? –
@Craig Đây không phải là một thay đổi đột phá, đó là một chi tiết thực hiện ***. Nếu bạn đã nắm bắt một biến bên trong đại biểu của bạn, bạn sẽ thấy cùng một hành vi. –