2017-04-22 102 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