2013-06-12 36 views
6

Xin lỗi nếu tôi hỏi câu hỏi ngớ ngẩn, nhưng ai cũng có thể giải thích sự khác biệt giữa hai cuộc gọi sau đây (ToArray). Trong intelliSense nó không hiển thị chúng như là các phương thức quá tải & tất nhiên đầu ra của cả hai cuộc gọi đều giống nhau.Sự khác biệt giữa ToArray() & ToArray <int>();

List<int> i = new List<int> { 1, 2, 5, 64 }; 
int[] input = i.Where(j => j % 2 == 1).ToArray(); 
input = i.Where(j => j % 2 == 1).ToArray<int>(); 

Trả lời

5

Không có sự khác biệt ở đây. Trong cuộc gọi đầu tiên, trình biên dịch đã suy ra loại int, trong khi trong lần thứ hai bạn đã chỉ định rõ ràng.

Có thể có các trường hợp loại cần thiết vì không thể suy ra được. Ví dụ: bạn có một bộ sưu tập tùy chỉnh triển khai IEnumerable<T> hai lần, cho hai loại khác nhau T. Điều này làm tổn thương khả năng sử dụng, do đó bạn nên tránh các công trình như vậy.

4

Đó là phương pháp chung chung. Trong trường hợp đầu tiên, tham số kiểu generic được suy ra bởi trình biên dịch từ tham số kiểu generic của Enumeration mà bạn đang gọi ToArray<T>(). Nhưng bạn cũng có thể chỉ định rõ ràng.

3

Chúng giống nhau. Bạn đang chứng kiến ​​cái được gọi là "suy luận kiểu". Trong một số trường hợp, trình biên dịch C# có thể phát hiện loại dựa trên các tham số được truyền vào và bạn không phải chỉ định rõ ràng các tham số kiểu. Trong ví dụ của bạn, nó được biết rằng i là một IEnumerable<int> và do đó .ToArray() có thể suy ra thông số int.

Đây là một bài viết tốt đẹp mà đi vào này trong chiều sâu: http://joelabrahamsson.com/a-neat-little-type-inference-trick-with-c/

5

Không có sự khác biệt, nó là phương pháp chính xác cùng ToArray(). Trình biên dịch có thể chỉ đơn giản suy ra rằng bạn muốn phiên bản ToArray<int> từ cú pháp của biểu thức. Giá trị trả về của Where() được suy ra để trả về int. Nói cách khác, nó sử dụng Where<int>(). Được suy ra từ loại Danh sách <>. Vì vậy, nó có thể suy ra rằng bạn cần ToArray<int>.

Vì vậy, chuỗi suy luận loại là List<int> =>Where<int>() =>ToArray<int>().

Thay đổi danh sách thành, ví dụ: List<long> và biểu thức vẫn hoạt động mà không phải sửa đổi nó.

2

Không có sự khác biệt.

int[] input = i.Where(j => j % 2 == 1).ToArray(); 

Ở đây, chỉ trình biên dịch được suy luận ra T luận chung dựa vào loại đếm được bạn gọi ToArray() trên.

input = i.Where(j => j % 2 == 1).ToArray<int>(); 

Ở đây, giá trị trả về của Where() được suy ra bởi trình biên dịch để trở int.

  • ToArray<T>() là chung để có thể hoạt động trên bất kỳ IEnumerable<T> nào.
  • ToArray() thực sự chỉ chuyển hướng đến một cách diễn giải ngầm định của ToArray<T>() dựa trên số T của nguồn IEnumerable.
  • Nếu bạn gọi một phương thức chung và không cung cấp bất kỳ đối số kiểu nào, trình biên dịch sẽ cố gắng suy ra chúng cho bạn.
Các vấn đề liên quan