2013-08-09 41 views
8

Xem dòng mã bên dưới:Tại sao ArgumentNullException? Tại sao không System.NullReferenceException?

DataTable [] _tables = null; 

// Throws System.NullReferenceException 
_tables.GetType(); 

// Throws System.ArgumentNullException 
_tables.Count(); 

Trong dòng mã này tôi có _tables tham khảo và cố gắng để truy cập vào hệ thống của nó xác định chức năng GetType()Count(), cả hai ném ngoại lệ nhưng tại sao .Count() ném System.ArgumentNullException, vì chúng ta có cùng một giá trị để tham khảo là null?

+1

có thể trùng lặp của [ArgumentNullException hoặc NullReferenceException từ phương pháp mở rộng?] (Http://stackoverflow.com/questions/463302/argumentnullexception-or-nullreferenceexception-from-extension-method) –

+0

@ 280Z28 Tôi nghĩ trong hàng đợi đó, Patrik Hägne yêu cầu "loại ngoại lệ tốt nhất để ném khi phương thức mở rộng được gọi trên một phiên bản trống" ... –

+1

http://blog.mischel.com/2013/05/16/null-parameters-in-extension-methods/ –

Trả lời

20

Count() là một extension method trên IEnumerable<T>, khai báo trong System.Linq.Enumerable - vì vậy bạn thực gọi:

Enumerable.Count(_tables); 

... do đó _tables một cuộc tranh luận phương pháp, và nó có ý nghĩa đối với các ngoại lệ để nói với bạn điều đó. Bạn không thực sự hủy đăng ký biến số _tables khi bạn gọi Count(), trong khi bạn khi bạn gọi GetType.

+0

Bạn có ý gì khi "dereferencing biến' _tables' "? –

+2

Nó có nghĩa là nhận được giá trị thực tế của tham chiếu - dereferencing (vì tham chiếu chỉ là một con trỏ đến một địa chỉ). – Charleh

+0

Xóa mọi khái niệm được đề cập trong câu trả lời này của các chuyên gia ..! 'phương pháp mở rộng' tôi tìm thấy intersting nhất.Cảm ơn tất cả các bạn đã trả lời đầy đủ. –

4

Count() là một phương pháp mở rộng (do đó nó nên ném một ArgumentNullException nếu được thông qua vào giá trị là null và null là bất hợp pháp), không phải là một phương pháp trên thể hiện của đối tượng ví dụ: Count được định nghĩa là public static int Count<T>(this IEnumerable<T> source).

4

Vì đây là phương pháp tiện ích và không phải là phương pháp thể hiện.

Vì nó được biên dịch thành Enumerable.Count(_tables), nó không áp dụng cho NullReferenceException, do đó, nó chỉ cần ném một số ArgumentNullException thay thế. Tuy nhiên, GetType là một phương pháp thể hiện, vì vậy bạn đang cố gắng gọi một phương thức trên null, mà ... um, không hoạt động.

7

Count đây là một cuộc gọi đến một phần mở rộng-phương pháp với _tables như là đối số - đó là thực tế:

System.Linq.Enumerable.Count(_tables); 

Nếu bạn không muốn sử dụng phương pháp mở rộng: sử dụng _tables.Length.

Các vấn đề liên quan