2016-09-20 207 views
5

這段代碼F#System.TypeLoadException

module ObjectRe = 
    type BM = A | N 
    type Object = { 
    Name: string 
    Pattern: BM array 
    } 

    let patterns = [|{Name = "Pro"; Pattern = [|A;N;N;A|]} |] 

我總是收到此錯誤信息

System.TypeLoadException: Could not load type 'FSI_0007+ObjectRe+Object[]' from assembly 'FSI-ASSEMBLY, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. 
    at (wrapper managed-to-native) System.Reflection.MonoMethod:InternalInvoke (System.Reflection.MonoMethod,object,object[],System.Exception&) 
    at System.Reflection.MonoMethod.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x00038] in <94fd79a3b7144c54b4cb162b50fc7761>:0 
Stopped due to error 

有沒有人的想法?我在Mac上使用Visual Studio代碼。

謝謝

+1

看起來你錯過了在模式定義結束時關閉'|'''。 –

+0

抱歉,我在複製過程中忘記了:/這不是問題 – kudi

+4

FWIW,上面的代碼在Windows 10上的Visual Studio 2015中運行時沒有問題,所以它可能是與環境有關的問題。 –

回答

7

我也可以在macOS 10.11,mono 4.6上重現此操作。

最小再現是:

module X = 
    type Y = Y 
    let l = [| Y |] 

有了一個解決辦法

module X = 
    type Y = Y 
    let g = List.toArray [ Y ] 

所以你的情況替換[| |]聲明。

爲什麼這隻發生在VS Code/fsharpi而不是Xamarin?

如果你火了活動監視器,您將看到VS代碼/ fsharpi使用 /Library/Frameworks/Mono.framework/Versions/4.6.0/lib/mono/4.5/fsi.exe二進制,但Xamarin Studio使用FCS Xamarin Studio.app/Contents/Resources/lib/monodevelop/AddIns/BackendBindings/MonoDevelop.FSharpInteractive.Service.exe您還可以檢查從交互上的第一條消息的版本(F# Interactive for F# 4.1,那些可能是不同的)。

最後,我相信這是一個單聲道+動態組件的錯誤,由fsi發出的代碼觸發。將此代碼編譯爲exe可以在所有平臺上正常工作(並且如果檢查生成的IL看起來很正常)。

相關問題