2011-01-05 28 views
6

我問的原因是,它只在方法參數聲明中有效,不是嗎?我試圖在函數體內創建一個名爲「params」的變量,但當然這不是什麼大問題,只是想知道MS選擇使其成爲全局關鍵字而不是上下文的原因。爲什麼params關鍵字不是上下文的?

+3

不知道爲什麼部分,但如果你真的想在c#中使用這個作爲變量名稱前言變量名稱@:int @params = 1; – Derrick 2011-01-05 21:44:16

回答

5

tvanoffson的答案推測,很難做出「參數」的上下文。它實際上不會那麼難。考慮:

void M(params x) 

在這種情況下,假設我們要做的是首先嚐試找到一個類型'params'。如果我們能找到一個,那就太棒了,我們完成了。如果我們不能,那麼我們有一個問題。假設,而不是x它是

void M(params Int32) 

顯然,這是一個錯誤,但什麼錯誤?我們是否應該假設Int32是參數名稱,並提供錯誤「您缺少類型」?我們是否應該假設Int32是類型,並給出錯誤,指出該類型必須是數組類型,並且缺少標識符?我們是否應該給出一個錯誤,說沒有名爲'params'的類型?這裏做什麼是正確的?顯然我們可以找出一些東西,但不明顯。

這是錯誤的情況下,與上下文關鍵字棘手;獲得成功案例的工作其實非常簡單。

但實際上,它並不如此,它是作出的上下文,因爲它使上下文不是一個真正的大贏。使「set」和「value」上下文相關是一個很大的勝利,因爲我們假設所有類型的人都希望使用「set」和「value」這樣的名稱來創建局部變量。 「params」甚至不是英文單詞,所以任何人都不想使用它。使其具有上下文關係沒有什麼大的好處,因此該功能的成本是不合理的。

+0

謝謝埃裏克。我真的希望能夠讀懂你的想法。對我來說,似乎有效的案例將是1.是否有params類型可用? 2.如果不是,則必須有Type []形式的類型,後跟一個標識符。我不是像你這樣的專家,但你認爲這涵蓋了所有情況嗎?你也是對的,它不是一個英文單詞,只是認爲它會在一些代碼中有用,而不是寫入參數/(s)。 – 2011-01-06 18:13:34

2

params關鍵字似乎只在方法參數聲明中有用,但我實際上同意MS,不管怎樣,讓關鍵字用於實例名稱都不是一個好主意。

也許他們都保留有這樣的事情在C#8.0的能力:

params Customers = DB.GetCustomerList(); 

,否則會將params在局部範圍內爲好。

+0

但那會怎麼樣?對我來說,在你展示的本地範圍內使用它沒有多大意義,是嗎?我不確定。順便說一句C#8.0是什麼時候出來的? :O – 2011-01-05 22:05:04

+1

我想2017年左右如果我的水晶球是準確的。 – 2011-01-05 22:24:04

+1

瓊 - 好問題。我不知道那會做什麼。實際上,由於語法錯誤,我甚至不認爲這行代碼會在C#8.0中編譯。 – Flipster 2011-01-06 02:44:18

9

關於任何其他關鍵字也可能會有同樣的問題。例如,爲什麼不是「class」上下文,因爲它只用於類聲明中?

給我一個關鍵字是一個關鍵字。我想這極大地簡化了編譯的詞法分析部分,而不必須知道上下文。

順便說一句,你可以使用@符號,讓你聲明瞭一個名爲「PARAMS」變量(或任何其他保留關鍵字):

var @params = new int[] { 1, 2 }; 
+0

謝謝,但如果類是contextual那麼他們將如何分離嵌套的類使用?但用params,沒有其他地方可以使用它,而且似乎很容易區分它們,但我不是像Eric Lippert這樣的編譯器大師。 – 2011-01-05 22:02:52

+0

我認爲你可以嘗試通過尋找典型的類聲明語法來創建'class'上下文:[accessibility modifier] class [class name] {}。但是我沒有足夠的編譯器規格來知道這是否可行。 – 2011-01-05 22:09:53

+0

好吧,這是有道理的。 – 2011-01-05 22:18:22

4

埃裏克利珀有一篇博客文章涉及contextual and reserved keywords及其歷史。雖然它沒有明確地解釋爲什麼params在保留列表中(它自1.0開始),這意味着它屬於一組保留字,它們將是hard以使上下文相關。

+0

謝謝,這是保留字的用途?我認爲這意味着它預留給將來的新潛在用途? – 2011-01-05 22:21:41

+2

@Joan - 有些可能是,但大多數都是*保留*,因爲「僅爲此目的保留」。 – tvanfosson 2011-01-05 22:24:34