我正在尝试从F#中的freebase提供程序中提取一个位置,我终于让它工作了。我想填写一个自定义类“Place”(来自C#)库。在我出错之前一切正常:
System.NullReferenceException: Object reference not set to an instance of an object.
此行发生此错误:
tempAddress.Address <- firstPlace.``Street address``.``Street Address`` |> Seq.head
所以我想调试它,看看出了什么问题。我已将所有内容都置于调试模式,即优化代码复选框,未经检查。我做了一个干净的重建解决方案。调试中的一切。我在那一行放了一个断点,令我惊讶的是,我看不到任何本地人,变数,什么都没有。只是断点停止了!这是我正在使用的代码:
let Extract mid = let dataWithKey = FreebaseDataWithKey.GetDataContext()
let place = dataWithKey.Commons.Travel.``Travel destinations``.Where( fun x-> x.MachineId = mid) |> Seq.toList
let result = new Place()
let firstPlace = place.Head
result.Name <- firstPlace.Name
let tempAddress = new FBAddress()
tempAddress.Address <- firstPlace.``Street address``.``Street Address`` |> Seq.head
result
调试时我只在Locals窗口看到这个
mid Cannot obtain value of local or argument 'mid' as it is not available at this instruction pointer, possibly because it has been optimized away. string
但是,我再次调试了一切。例如,我可以调试普通的C#代码,这只发生在F#项目中。
有没有办法让VS2013向我展示当地人?或者在我的手表上发现我的任何东西?谢谢!
编辑我用另一个代码安静进行了一点测试,一个人检查一个单词是否是回文,我能够调试,进入代码,并观察本地和变量。就在我下载FSharp.Data的nuget包并开始编码时,它正确地进行了调试。我看到当调用此行时,本地人会消失:
let place = dataWithKey.Commons.Travel.``Travel destinations``.Where( fun x-> x.MachineId = mid) |> Seq.toList
在此之前,我能够看到“mid”变量内容
答案 0 :(得分:1)
对于已擦除类型的提供程序,您看到的代码与在运行时实际执行的代码非常不同,因此有时调试器会遇到一些问题。 Freebase甚至更糟糕,因为有很多IQueryable转换正在进行中。您是否尝试在“调试器”部分的VS选项中检查“启用源服务器支持”,并尝试单步执行FSharp.Data源代码?