Lý do tôi hỏi là, nó chỉ hợp lệ trong khai báo tham số phương thức, phải không? Tôi đã cố gắng để tạo ra một biến bên trong cơ thể chức năng gọi là "params", nhưng tất nhiên đây không phải là một vấn đề lớn, chỉ cần tự hỏi lý do MS chọn để làm cho nó một từ khóa toàn cầu và không theo ngữ cảnh.Tại sao từ khóa params không theo ngữ cảnh?
Trả lời
câu trả lời tvanoffson của phỏng đoán rằng nó sẽ rất khó để làm cho "params" theo ngữ cảnh. Nó thực sự sẽ không phải là khó khăn. Hãy xem xét:
void M(params x)
Điều chúng tôi làm trong trường hợp này, theo giả thuyết, trước tiên tìm cách loại 'thông số'. Nếu chúng ta có thể tìm thấy một, tuyệt vời, chúng ta đã xong. Nếu chúng ta không thể, thì chúng ta có một chút rắc rối. giả sử ví dụ thay vì x là
void M(params Int32)
Rõ ràng đó là lỗi, nhưng lỗi gì? Chúng ta có nên giả định rằng Int32 là tên tham số và đưa ra lỗi "bạn đang thiếu kiểu"? Chúng ta có nên giả định rằng Int32 là loại và đưa ra một lỗi nói rằng loại phải là một loại mảng, và rằng bạn đang thiếu định danh? Chúng ta có nên đưa ra một lỗi nói rằng không có loại có tên 'params'? Điều phải làm ở đây là gì? Rõ ràng chúng ta có thể tìm ra điều gì đó nhưng không rõ ràng.
Đó là các trường hợp lỗi mà là khó khăn với các từ khóa theo ngữ cảnh; nhận được các trường hợp thành công làm việc thực sự là khá đơn giản.
Nhưng thực sự, nó không phải là quá nhiều mà nó là cứng để làm cho bối cảnh như làm cho nó theo ngữ cảnh không phải là một chiến thắng thực sự lớn. Việc đặt bối cảnh "set" và "value" là một thắng lợi lớn bởi vì chúng tôi giả định rằng tất cả mọi người sẽ muốn tạo các biến cục bộ với các tên như "set" và "value". "params" thậm chí không phải là một từ tiếng Anh, do đó, có vẻ như ít có khả năng ai đó sẽ muốn sử dụng nó. Không có lợi ích lớn để làm cho nó theo ngữ cảnh, do đó, chi phí của tính năng này là không hợp lý.
Cảm ơn Eric. Tôi đã thực sự hy vọng để đọc những gì bạn đã có trong tâm trí. Đối với tôi, có vẻ như các trường hợp hợp lệ sẽ là 1. Có loại params nào không? 2. Nếu không, thì phải có một loại ở dạng Type [], và theo sau là một số nhận dạng. Tôi không phải là một chuyên gia như bạn, nhưng bạn có nghĩ rằng điều này bao gồm tất cả các trường hợp? Ngoài ra bạn là đúng, nó không phải là một từ tiếng Anh, chỉ nghĩ rằng nó sẽ hữu ích trong một số mã, thay vì viết tham số/(s). –
Các params từ khóa không tìm đến được chỉ hữu ích trong việc khai thông số phương pháp, nhưng tôi thực sự đồng ý với MS rằng nó sẽ không phải là một ý tưởng tốt để cho các từ khóa được sử dụng cho các tên instance, anyway.
Có lẽ họ đang đặt khả năng có một cái gì đó như thế này trong C# 8.0:
params Customers = DB.GetCustomerList();
Hoặc nếu không cho phép params
trong một phạm vi địa phương là tốt.
Nhưng điều đó sẽ làm gì? Để tôi sử dụng nó trong phạm vi địa phương mà bạn cho thấy sẽ không có ý nghĩa nhiều, phải không? Tôi không chắc. Btw khi nào C# 8.0 sắp ra mắt? : O –
tôi nghĩ rằng khoảng 2017 nếu quả cầu pha lê của tôi là chính xác. –
Joan - Câu hỏi hay. Tôi không biết nó sẽ làm gì. Trong thực tế, tôi thậm chí không nghĩ rằng dòng mã sẽ biên dịch trong C# 8.0 do lỗi cú pháp. – Flipster
Điều tương tự cũng được hỏi về bất kỳ từ khoá khác. Ví dụ, tại sao không phải là "class" theo ngữ cảnh vì nó chỉ được sử dụng trong các khai báo lớp?
Đối với tôi một từ khóa là một từ khóa. Tôi tưởng tượng nó đơn giản hóa rất nhiều phần phân tích từ vựng của trình biên dịch để không phải là nhận thức ngữ cảnh đó.
Là một sang một bên, bạn có thể sử dụng các biểu tượng @
để cho phép bạn khai báo một biến gọi là 'params' (hoặc bất kỳ từ khoá reserved khác):
var @params = new int[] { 1, 2 };
Cảm ơn nhưng nếu lớp học theo ngữ cảnh thì làm cách nào để tách biệt cách sử dụng lớp lồng nhau? Nhưng với params, không có nơi nào khác để sử dụng nó, và có vẻ như nó sẽ dễ dàng để phân biệt chúng, nhưng tôi không phải là một trình biên dịch maestro như Eric Lippert. –
Tôi nghĩ bạn có thể cố gắng làm cho ngữ cảnh 'lớp' bằng cách tìm cú pháp khai báo lớp điển hình: [class modifier] class [class name] {}. Nhưng tôi không lên trên trình biên dịch spec đủ để biết nếu điều này là thực sự khả thi. –
Ok có ý nghĩa. –
Eric Lippert có một bài đăng blog bao gồm contextual and reserved keywords và họ lịch sử. Mặc dù nó không giải thích rõ ràng lý do tại sao params nằm trong danh sách dành riêng (nó đã được kể từ 1.0), nó ngụ ý rằng nó thuộc về tập các từ dành riêng đó sẽ là cứng để làm theo ngữ cảnh.
Cảm ơn, đó là những từ dành riêng cho? Tôi nghĩ rằng nó có nghĩa là nó dành riêng cho sử dụng tiềm năng mới trong tương lai? –
@Janan - một số có thể, nhưng hầu hết là * được bảo lưu * như trong "chỉ dành riêng cho mục đích này". – tvanfosson
- 1. Tại sao bạn không thể sử dụng từ khóa không an toàn trong ngữ cảnh trình lặp?
- 2. Tại sao có lỗi ngữ cảnh không hợp lệ?
- 3. .net phản ánh và từ khóa "params"
- 4. Tại sao ngữ cảnh mùa xuân được nạp hai lần?
- 5. Tên 'EntityState' không tồn tại trong ngữ cảnh hiện tại
- 6. Chính xác từ khóa 'params' hoạt động như thế nào?
- 7. CLR không thể chuyển đổi từ ngữ cảnh COM 0x3b2d70 sang ngữ cảnh COM
- 8. Tên không tồn tại trong ngữ cảnh hiện tại
- 9. Tại sao từ khóa không đồng bộ tồn tại
- 10. FragmentManager từ Ngữ cảnh
- 11. Tên 'ViewBag' không tồn tại trong ngữ cảnh hiện tại
- 12. Ngữ cảnh miễn phí ngữ cảnh cho không phải palindrome
- 13. Tại sao LINQ không bao gồm từ khóa `khác biệt`?
- 14. Tại sao IntPtr không cần từ khóa không an toàn?
- 15. Tại sao tôi không nhận được cảnh báo từ Perl?
- 16. HttpUtility không tồn tại trong ngữ cảnh hiện tại
- 17. Biến không tồn tại trong ngữ cảnh hiện tại?
- 18. OnPropertyChange không tồn tại trong ngữ cảnh hiện tại?
- 19. Thuộc tính không tồn tại trong ngữ cảnh hiện tại
- 20. Tên 'ClientScript' không tồn tại trong ngữ cảnh hiện tại
- 21. Quá tải, suy luận kiểu chung và từ khóa 'params'
- 22. Trợ giúp theo ngữ cảnh Eclipse
- 23. Cách tạo UIImage từ ngữ cảnh đồ họa hiện tại?
- 24. Http động từ ngữ cảnh http hiện tại
- 25. Tại sao từ khóa "gói" và .h?
- 26. Tại sao sử dụng từ khóa void?
- 27. Tại sao số 'NaN' theo pragma cảnh báo?
- 28. Ngữ cảnh ứng dụng mùa xuân: truy cập vào web.xml context-params?
- 29. Bạn có thể sử dụng từ khóa params trong một đại biểu không?
- 30. thay đổi ngữ cảnh từ qml
Không chắc chắn về lý do tại sao một phần, nhưng nếu bạn thực sự muốn sử dụng điều này như một tên biến trong C# lời nói đầu tên biến với @: int @params = 1; – Derrick