2014-11-11 11 views
11

cú pháp hợp lệ:Tại sao C# cho phép dấu phẩy theo dấu trong bộ khởi tạo bộ sưu tập nhưng không cho phép tham số?

var test = new List<string> 
{ 
    "a", 
    "b", 
    "c",//Valid trailing comma 
}; 

không hợp lệ cú pháp:

private void Test(params string[] args) 
{ 
} 

Test(
    "a", 
    "b", 
    "c",//Invalid trailing comma 
); 

có phải là một vấn đề mâu thuẫn cú pháp hoặc quyết định tính toán?

+0

Trong ví dụ thứ hai, trình biên dịch sử dụng dấu phẩy để đối số phương pháp riêng biệt, không thu thập các mặt hàng. 'params' được xử lý riêng. Trên các đối số phương thức bạn chưa bao giờ có thể để lại dấu phẩy. –

+1

Trình biên dịch không phải là một con người, nó không biết và không quan tâm rằng bạn muốn chuyển một bộ sưu tập đến phương thức. Nó chỉ "nhìn thấy" rằng cú pháp không hợp lệ. Cú pháp cũ là hợp lệ vì nó được cho phép trong đặc tả ngôn ngữ để khởi tạo các bộ sưu tập. –

+2

Câu hỏi này đã bị đóng không chính xác là trùng lặp. [Câu hỏi được liên kết] (http: // stackoverflow.com/questions/3675173/why-can-you-have-a-dấu phẩy-at-the-end-of-a-bộ sưu tập-initializer) trả lời "tại sao chúng ta cho phép dấu phẩy trên bộ sưu tập initialisers", trong khi điều này là yêu cầu " tại sao chúng ta không được phép dấu phẩy cho các tham số phương thức 'params'. Điều đó nói rằng, câu trả lời sẽ là tương tự - nhưng câu hỏi là không. –

Trả lời

10

Vì vậy, tôi sẽ có một đâm vào điều này mặc dù tôi sẽ không bao giờ biết lý do "thực sự" như tôi đã không ở trong nhóm biên dịch - và khả năng một trong số đó là vấn đề.

Tạo dấu phẩy thường hữu ích trong một vài trường hợp, cụ thể là hợp nhất và tạo mã. Trong bối cảnh của các công cụ như bộ sưu tập hoặc khởi tạo thuộc tính và enums, để lại dấu phẩy sau là vô hại (trình biên dịch có thể suy ra một cách an toàn "kết thúc danh sách" vì cũng có một khung chặn đóng nó có thể móc vào.

khá rõ ràng - trình biên dịch cần nhiều quyền kiểm soát trong lĩnh vực này để nó có thể cung cấp phản hồi tốt khi mọi người đang mã hóa và cho các tính năng phụ trợ khác. bắt đầu gây nhầm lẫn về cách xử lý mã "không đầy đủ" (người dùng có để nó ở đó một cách có chủ ý hoặc họ sắp gõ vào đối số tiếp theo không?).

Bạn đúng là params rơi vào khái niệm khoảng trống trong đó bạn thấy chúng như là một mảng, và bạn có thể chỉ định chúng như là dấu phẩy phân cách (được hỗ trợ trước khi bộ sưu tập initialisers). Vì vậy, tại sao họ khởi hành theo phong cách từ bộ sưu tập initialisers?

Thông số ngôn ngữ cho bit params không chỉ định rõ ràng hỗ trợ dấu phẩy, mặc dù nó cho bộ khởi tạo bộ sưu tập tương đương với các ngôn ngữ khác (C++ tôi nghĩ), làm tăng sự quen thuộc với các nhà phát triển di chuyển sang C# từ nơi khác.

Giả sử của tôi: thực tế là nó không được mô tả sau đó gây ra YAGNI để áp dụng và từ thời điểm đó chuyển tiếp đề xuất giá trị cho đối tượng địa lý là không có trí tuệ có lợi cho việc không triển khai nó.

+2

"người dùng có để nó ở đó một cách có chủ ý hoặc họ sắp gõ vào đối số tiếp theo?" lý luận cũng chỉ áp dụng cho các enums và các danh sách khởi tạo. Ngoài ra, các cuộc gọi phương thức cũng có mặt trong mã được tạo ra, và cũng đang được hợp nhất :) – BartoszKP

+2

Thật vậy, nhưng lý do là ít quan trọng bởi vì trình biên dịch không cố gắng để treo lên các giá trị enum chưa biết. Tôi nghĩ rằng nó rơi vào thể loại giá trị tối thiểu và chi phí phát triển. Có những lý lẽ chắc chắn cho nó và tôi không tranh cãi một trường hợp nào cả. Tôi chỉ đang cố gắng định lý về lý do tại sao mọi thứ lại như vậy. –

+1

Phần về "các giá trị không xác định" trong nhận xét của bạn dường như đã xuất hiện tại vị trí này. Khoảng cách khái niệm trong câu trả lời của bạn cũng - chúng dường như có liên quan nhất, các phần khác gần như là tiếng ồn;) Mặc dù cố gắng hết sức về câu hỏi khó này tổng thể. – BartoszKP

1

nếu bạn nhìn vào từ vựng Grammer here

C.2.9 Mảng

array-initializer: 
{ variable-initializer-listopt } 

{ variable-initializer-list , }// This comma is causing this 

variable-initializer-list: 
variable-initializer 
variable-initializer-list , variable-initializer 

Calling Chức năng là Như thế này .... methodname (chính thức tham số-listopt);

formal-parameter-list: 
fixed-parameters 
fixed-parameters , parameter-array 
parameter-array 
fixed-parameters: 
fixed-parameter 
fixed-parameters , fixed-parameter 
fixed-parameter: 
attributesopt parameter-modifieropt type identifier 
parameter-modifier: 
ref 
out 
parameter-array: 
attributesopt params array-type identifier 

Không có chỗ cho trailing dấu phẩy nó được vì ngôn ngữ được viết theo cách đó, tôi không biết lý do nhưng adam biết

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