2017-04-22 104 views
4

在Visual Studio 2015:F#:雙重提取值名稱與函數名稱衝突?

let myFunction (``string`` : string) = 
    "\"Quoted string\"" |> (Regex "\"[^\"]*\"").Match |> string 

let myOtherFunction (str : string) = 
    "\"Quoted string\"" |> (Regex "\"[^\"]*\"").Match |> string 

首先函數生成編譯器錯誤,則string功能在紅色下劃線。 (「這表達預計將有類型相匹配 - >「一但這裏的類型是字符串」)

第二個功能是很好,沒有問題。

這是設計嗎?

回答

5

的原因是,你的參數並在結束通話是一樣的。雙反引號是用來逃跑的名字,他們不是名的一部分。

所以在你的情況下,這意味着``string``string是完全一樣的東西,你試圖管入你的字符串參數。是的,這完全是由設計。

C#等價物是@轉義名稱,例如@hellohello會發生衝突。

+1

而且,事實上,雙反引號是沒有必要在這裏所有。你可以寫'讓上(字符串:字符串)= string.ToUpper()',它會工作:'上「富」'會產生的結果'「FOO」'。唯一一次雙反引號是** **必需的是,如果你想通過像'type'關鍵字的名字來命名的參數,或者如果你想在其名稱中的空格或其他常非法標點符號。 – rmunn