【发布时间】:2015-10-19 01:55:29
【问题描述】:
请有人在这里检查我的理智。鉴于这个简单的功能:
let filterOut item l =
l |> List.filter (fun t -> not (t = item))
let f =
["1";"2";"3"]
|> filterOut "3"
在 FSI 中评估上述内容会产生以下结果:
-
Mac OS X 上带有单声道 4.0.3 的 Xamarin Studio
val f : 字符串列表 = ["1"]
-
Visual Studio 2013
val f : 字符串列表 = ["1"; "2"]
如果输入是整数或字符的列表 - 那么它会按预期工作,并且两个平台都会产生相同的结果。此外,如果我指定 filterOut 仅使用字符串,它会正确生成相同的值。像这样:
let filterOut item l:list<string> =
l |> List.filter (fun t -> not (t = item))
即使是在 OS X 上使用 XS 的以下代码:
let filterOut item l =
l |> List.filter (fun t -> not (t = item))
let f =
["1";"2";"3"]
|> filterOut "foobar"
输出:
val f : string list = ["1"]
我比较了 XS 和 VS 编译代码之间的 IL,它们看起来相同。因此,这似乎是运行时差异。 如果 List.Filter 和 Mono 上的字符串进行泛型比较有什么问题?
编辑:如果我在 filterOut 函数中添加“内联”,我也会在两个平台上得到正确的结果(OS X 上的预期输出)。 Mono 运行时上的通用比较器似乎又出现了问题。
【问题讨论】:
-
我使用 Linux Mono 4.0.2 检查了它,第一个例子给了我正确的输出 ["1"; “2”]。但是带有“foobar”的第二个给出了不正确的 ["1"; “2”]。在这两种情况下,将定义与内联一起使用都会给出正确的答案。为了检查 Windows 上的正确性,我使用了dotnetfiddle.net
-
@lad2025 感谢您的检查。
-
显然是一个错误,正如你所说,它看起来可能是 Mono 运行时的一个问题,你能针对 Mono 运行时提交一个错误吗? mono-project.com/community/bugs
-
@PhillipTrelford 谢谢 - 忙着呢。