我問的原因是,它只在方法參數聲明中有效,不是嗎?我試圖在函數體內創建一個名爲「params」的變量,但當然這不是什麼大問題,只是想知道MS選擇使其成爲全局關鍵字而不是上下文的原因。爲什麼params關鍵字不是上下文的?
回答
tvanoffson的答案推測,很難做出「參數」的上下文。它實際上不會那麼難。考慮:
void M(params x)
在這種情況下,假設我們要做的是首先嚐試找到一個類型'params'。如果我們能找到一個,那就太棒了,我們完成了。如果我們不能,那麼我們有一個問題。假設,而不是x它是
void M(params Int32)
顯然,這是一個錯誤,但什麼錯誤?我們是否應該假設Int32是參數名稱,並提供錯誤「您缺少類型」?我們是否應該假設Int32是類型,並給出錯誤,指出該類型必須是數組類型,並且缺少標識符?我們是否應該給出一個錯誤,說沒有名爲'params'的類型?這裏做什麼是正確的?顯然我們可以找出一些東西,但不明顯。
這是錯誤的情況下,與上下文關鍵字棘手;獲得成功案例的工作其實非常簡單。
但實際上,它並不如此,它是難作出的上下文,因爲它使上下文不是一個真正的大贏。使「set」和「value」上下文相關是一個很大的勝利,因爲我們假設所有類型的人都希望使用「set」和「value」這樣的名稱來創建局部變量。 「params」甚至不是英文單詞,所以任何人都不想使用它。使其具有上下文關係沒有什麼大的好處,因此該功能的成本是不合理的。
謝謝埃裏克。我真的希望能夠讀懂你的想法。對我來說,似乎有效的案例將是1.是否有params類型可用? 2.如果不是,則必須有Type []形式的類型,後跟一個標識符。我不是像你這樣的專家,但你認爲這涵蓋了所有情況嗎?你也是對的,它不是一個英文單詞,只是認爲它會在一些代碼中有用,而不是寫入參數/(s)。 – 2011-01-06 18:13:34
params關鍵字似乎只在方法參數聲明中有用,但我實際上同意MS,不管怎樣,讓關鍵字用於實例名稱都不是一個好主意。
也許他們都保留有這樣的事情在C#8.0的能力:
params Customers = DB.GetCustomerList();
,否則會將params
在局部範圍內爲好。
但那會怎麼樣?對我來說,在你展示的本地範圍內使用它沒有多大意義,是嗎?我不確定。順便說一句C#8.0是什麼時候出來的? :O – 2011-01-05 22:05:04
我想2017年左右如果我的水晶球是準確的。 – 2011-01-05 22:24:04
瓊 - 好問題。我不知道那會做什麼。實際上,由於語法錯誤,我甚至不認爲這行代碼會在C#8.0中編譯。 – Flipster 2011-01-06 02:44:18
關於任何其他關鍵字也可能會有同樣的問題。例如,爲什麼不是「class」上下文,因爲它只用於類聲明中?
給我一個關鍵字是一個關鍵字。我想這極大地簡化了編譯的詞法分析部分,而不必須知道上下文。
順便說一句,你可以使用@
符號,讓你聲明瞭一個名爲「PARAMS」變量(或任何其他保留關鍵字):
var @params = new int[] { 1, 2 };
謝謝,但如果類是contextual那麼他們將如何分離嵌套的類使用?但用params,沒有其他地方可以使用它,而且似乎很容易區分它們,但我不是像Eric Lippert這樣的編譯器大師。 – 2011-01-05 22:02:52
我認爲你可以嘗試通過尋找典型的類聲明語法來創建'class'上下文:[accessibility modifier] class [class name] {}。但是我沒有足夠的編譯器規格來知道這是否可行。 – 2011-01-05 22:09:53
好吧,這是有道理的。 – 2011-01-05 22:18:22
埃裏克利珀有一篇博客文章涉及contextual and reserved keywords及其歷史。雖然它沒有明確地解釋爲什麼params在保留列表中(它自1.0開始),這意味着它屬於一組保留字,它們將是hard以使上下文相關。
謝謝,這是保留字的用途?我認爲這意味着它預留給將來的新潛在用途? – 2011-01-05 22:21:41
@Joan - 有些可能是,但大多數都是*保留*,因爲「僅爲此目的保留」。 – tvanfosson 2011-01-05 22:24:34
- 1. 爲什麼使用params關鍵字
- 2. 爲什麼上下文是使用「this」關鍵字在JavaScript
- 3. 什麼是Hadoop編程世界中的關鍵字上下文?
- 4. Objective-C上下文中__typeof關鍵字的含義是什麼?
- 5. 什麼是typeof關鍵字
- 6. 什麼是RCS關鍵字?
- 7. 爲什麼不使用new關鍵字
- 8. 爲什麼params [:id]是零?
- 9. 以下關鍵的標準是什麼?
- 10. 在Java中,爲什麼instanceof是關鍵字而不是方法?
- 11. 下面的driver_options params是什麼意思?
- 12. 爲什麼迴歸和throw關鍵字的不是靜態塊
- 13. var關鍵字不是推斷RepeaterItem的類型,爲什麼?
- 14. 什麼是「關鍵點」[opencv上下文],FAST,GetStarKeypoints等有什麼作用?
- 15. 什麼是synchronized關鍵字的使用?
- 16. 什麼是新的關鍵字?
- 17. 'final'關鍵字的含義是什麼?
- 18. C#中的Register關鍵字是什麼?
- 19. JavaScript中的`name`關鍵字是什麼?
- 20. Java中的native關鍵字是什麼?
- 21. 「With」關鍵字的功能是什麼
- 22. 什麼是PHP中的`finally`關鍵字?
- 23. 什麼是Oracle中的'THE'關鍵字?
- 24. Xcode中的(named)關鍵字是什麼?
- 25. 什麼是Swift中的'const'關鍵字?
- 26. 什麼是Java中的關鍵字?
- 27. swift中的「as」關鍵字是什麼
- 28. 什麼是PLSQL中的RESULT關鍵字?
- 29. $ this關鍵字的含義是什麼?
- 30. 什麼是Swift中的「open」關鍵字?
不知道爲什麼部分,但如果你真的想在c#中使用這個作爲變量名稱前言變量名稱@:int @params = 1; – Derrick 2011-01-05 21:44:16