gpt4 book ai didi

f# - F#4中的编译器错误?

转载 作者:行者123 更新时间:2023-12-03 12:51:19 26 4
gpt4 key购买 nike

我有一些F#4.0源代码,可以在Debug中很好地进行编译,但在Release中却没有。

没有条件定义,推断类型没有变化,我想不出的任何其他东西都可以向我解释这种差异。

我真的偶然发现了编译器错误吗?

这是有问题的代码的片段。

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。

更新:

以下是一个完整的示例。您可以创建一个F#控制台应用程序,并将其粘贴到Program.fs中。我希望它将在Debug中进行编译,但不会在Release中进行编译。

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 -> ()

最佳答案

似乎是编译器错误(可能与1020有关)。
可以用您的代码和F#版本14.0.23413.0重现它
现在安装了当前的preview,它是F#版本14.0.23618.0,并且可以正常工作。

关于f# - F#4中的编译器错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37830382/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com