Xem xét các mã ví dụ sau:Tạo hai trường hợp đại biểu cho phương thức ẩn danh cùng không bằng nhau
static void Main(string[] args)
{
bool same = CreateDelegate(1) == CreateDelegate(1);
}
private static Action CreateDelegate(int x)
{
return delegate { int z = x; };
}
Bạn sẽ tưởng tượng rằng hai trường hợp đại biểu sẽ so sánh để được bình đẳng, cũng giống như họ sẽ khi sử dụng tốt phương pháp tiếp cận phương pháp được đặt tên cũ (hành động mới (MyMethod)). Họ không so sánh để được bình đẳng bởi vì các.NET Framework cung cấp một trường hợp đóng cửa ẩn cho mỗi trường hợp đại biểu. Vì hai cá thể đại biểu đó đều có thuộc tính Target được đặt cho cá thể ẩn riêng của chúng, nên chúng không so sánh. Một giải pháp có thể là cho IL được tạo ra cho một phương thức nặc danh để lưu trữ cá thể hiện tại (con trỏ này) trong đích của đại biểu. Điều này sẽ cho phép các đại biểu để so sánh chính xác, và cũng giúp từ một quan điểm trình gỡ lỗi vì bạn sẽ thấy lớp của bạn là mục tiêu, thay vì một lớp ẩn.
Bạn có thể đọc thêm về vấn đề này trong lỗi mà tôi đã gửi cho Microsoft. Báo cáo lỗi cũng đưa ra một ví dụ về lý do tại sao chúng tôi đang sử dụng chức năng này và tại sao chúng tôi cảm thấy nó nên được thay đổi. Nếu bạn cảm thấy đây cũng là vấn đề, vui lòng giúp hỗ trợ nó bằng cách cung cấp xếp hạng và xác thực.
https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=489518
Bạn có thể thấy bất kỳ lý do có thể lý do tại sao các chức năng không nên thay đổi? Bạn có cảm thấy đây là hành động tốt nhất để giải quyết vấn đề hay bạn khuyên tôi nên đi theo một tuyến đường khác?
Trong đó đặc điểm kỹ thuật nào Microsoft đề cập rằng hai giá trị này phải bằng nhau? Với cùng một lý do, tôi có thể lập luận rằng 'new MyClass() == new MyClass()' phải là 'true' nếu' MyClass' là một lớp rỗng, chẳng hạn. Bạn quá nhanh để đặt tên cho một hành vi không được đề cập trong bất kỳ thông số nào là "lỗi". –
Trong đó đặc điểm kỹ thuật nào họ đề cập rằng họ không nên bằng nhau? –