2016-09-20 208 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看起来很正常)。

相关问题