thể trùng lặp:
How does the method overload resolution system decide which method to call when a null value is passed?Null đen loại thông số độ phân giải quá tải
Đây là một câu hỏi về việc tại sao các biên dịch sẽ chọn một tình trạng quá tải nhất định khi thông qua một null đen như một tham số, chứng minh bởi string.Format overloads.
string.Format ném một số ArgumentNullException
khi sử dụng null cho tham số arg.
string.Format("foo {0}", null);
Phương thức định dạng có một số tình trạng quá tải.
string.Format(string, object);
string.Format(string, object[]);
string.Format(IFormatProvider, string, object[]);
Chạy qua mã bị biên dịch, ngoại lệ đối với các tham số rỗng bằng chữ được ném từ phương pháp thứ hai. Tuy nhiên, các ví dụ sau đây gọi phương thức đầu tiên ở trên (như mong đợi) và sau đó gọi phương thức thứ hai gọi là thứ ba cuối cùng chỉ trả về "foo".
string x = null;
string.Format("foo {0}", x);
string y;
string.Format("foo {0}", y = null);
Nhưng string.Format("foo {0}", null)
gọi phương thức thứ hai ở trên và dẫn đến ngoại lệ không. Tại sao trình biên dịch quyết định rằng chữ cái trống khớp với chữ ký phương thức thứ hai thay vì chữ ký đầu tiên trong trường hợp này?
Có lẽ mở rộng tiêu đề/phạm vi nếu điều này bao gồm vararg theo nghĩa chung hơn (nếu nó không phải là chuỗi.Định dạng cụ thể) ... –
Pete, bạn có thể biết điều này (và nó không phải là câu trả lời cho bạn) nhưng mặc dù tôi sẽ đề cập đến nó; để tránh ngoại lệ này, bạn có thể sử dụng 'Chuỗi.Định dạng ("Kiểm tra {0}", String.Empty); '. Tất cả là tốt nhất. – MoonKnight
Câu hỏi trùng lặp: http://stackoverflow.com/q/5173339/25727. Tóm lại: Độ phân giải quá tải thích các loại cụ thể hơn. Vì vậy, nó chọn mảng vì 'đối tượng' là loại không xác định nhất trong .NET. – Jan