Ho una sorgente F # 4.0 che compila bene in Debug, ma non in Release.Errore del compilatore in F # 4?
Non ci sono definizioni condizionali, nessuna modifica nei tipi dedotti e nient'altro a cui riesco a pensare, che possa spiegare questa differenza a me.
Ho davvero inciampato in un bug del compilatore?
Questo è uno snippet con il codice problematico.
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 ->
Il messaggio di errore si riferisce all'ultimo uso di "oldItems", prima che il "con" parola chiave, alla fine della lunga fila. Il messaggio di errore è:
valore indefinito 'oldItems: lista UserDisplayItem'
Cosa !? oldItems è in bella vista alcune righe sopra, e questo compila in Debug, quindi perché non in Release? Cosa significa in realtà quel messaggio di errore?
UserDisplayItem è una classe semplice. newItems è un ResizeArray di UserDisplayItem
Ho esaminato la cronologia di compilazione e ha compilato correttamente in Release quando UserDisplayItem era un record immutabile F # e non una classe.
Visual Studio 2015, F # 4.0, Qualsiasi CPU, versione, .NET 4.5.2 targetizzato.
UPDATE:
Quanto segue è un esempio completo. È possibile creare un'applicazione per console F # e incollarla in Program.fs. Mi aspetto che verrà compilato in Debug, ma non 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 ->()
UPDATE 2:
Un campione ancora più breve.
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 ->()
E riguardo 'match oldItems |> List.tryFind (fun itemOfOld -> itemOfOld.Id = newItem.Id) with'? – ildjarn
Ancora lo stesso errore durante il piping, e ancora solo in Release, non in Debug. –
Impossibile riprodurre dal codice e dai tipi fittizi/implementazione e versioni corrispondenti di VS, F #, impostazioni di compilazione e destinazione del framework. Il codice dato non funziona da solo; la fonte del problema potrebbe essere al di fuori di ciò che hai postato. Si prega di fornire una replica minima, completa di eventuali passi noti per ottenere l'errore. – Vandroiy