我有一些 F# 4.0 源代码,可以在调试中正常编译,但在发布中则不行。
没有条件定义,推断类型没有变化,我能想到的也没有其他东西可以向我解释这种差异。
我真的偶然发现了编译器错误吗?
这是有问题的代码片段。
let oldItems = userDisplayItems |> Seq.toList
for newItem in newItems do
match List.tryFind (fun (itemOfOld: UserDisplay.UserDisplayItem) -> itemOfOld.Id = newItem.Id) oldItems with
| Some oldItem ->
错误消息指的是长行末尾的“with”关键字之前最后一次使用的“oldItems”。错误信息是:
未定义值“oldItems:UserDisplayItem列表”
什么!? oldItems 在上面几行中显而易见,并且可以在 Debug 中编译,那么为什么不在 Release 中编译呢?该错误消息的实际含义是什么?
UserDisplayItem 是一个简单的类。
newItems 是 UserDisplayItem 的 ResizeArray
我查看了构建历史记录,当 UserDisplayItem 是 F# 不可变记录而不是类时,它在 Release 中编译得很好。
Visual Studio 2015,F# 4.0,任何 CPU,版本,面向 .NET 4.5.2。
UPDATE:
下面是一个完整的例子。您可以创建一个 F# 控制台应用程序,并将其粘贴到 Program.fs 中。我希望它会在调试中编译,但不会在发布中编译。
open System.Collections.ObjectModel
type User = { Id: int }
[<AllowNullLiteral>]
type UserDisplayItem(id: int) =
let mutable id = id
member x.Id with get() = id and set(v) = id <- v
let userDisplayItems = new ObservableCollection<UserDisplayItem>()
let refreshList () =
let newItems = userDisplayItems
let oldItems = userDisplayItems |> Seq.toList
for newItem in newItems do
match List.tryFind (fun (itemOfOld: UserDisplayItem) -> itemOfOld.Id = newItem.Id) oldItems with
| Some oldItem -> ()
| None -> ()
更新2:
更短的样本。
type UserDisplayItem = { Id: int }
let refreshList () =
let newItems = new ResizeArray<UserDisplayItem>()
let oldItems = new ResizeArray<UserDisplayItem>() |> Seq.toList
for newItem in newItems do
match List.tryFind (fun (itemOfOld: UserDisplayItem) -> itemOfOld.Id = newItem.Id) oldItems with
| Some oldItem -> ()
| None -> ()