Visual Studio未检测F#代码空引用问题的原因及解决方法
问题与解决过程
代码示例
我编写了如下F#代码:
let readTemplate template = let assembly = System.Reflection.Assembly.GetExecutingAssembly() use stream = assembly.GetManifestResourceStream ($"Api.services.Email.templates.{template}") use reader = new StreamReader (stream) reader.ReadToEnd ()
注意GetManifestResourceStream返回Stream | null。
项目配置
我的Directory.Build.props配置如下:
<Nullable>enable</Nullable> <ImplicitUsings>enable</ImplicitUsings> <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
问题现象
上述代码在Visual Studio的Debug和Release模式下均可正常编译运行,但在GitHub Action中使用Docker容器内的.NET 9.0 SDK执行dotnet build -c Release时,会触发stream可能为null的编译错误。即使去掉use关键字直接赋值,Visual Studio也不会提示空引用问题,我希望直接处理返回的Stream | null而非使用|> Option.ofObj。
问题排查与解决
本地曾安装3个.NET SDK版本:
- 9.0.101
- 9.0.103(来自Visual Studio)
- 9.0.202
通过global.json指定SDK版本后发现:
- 9.0.101/9.0.103:编译无错误(不符合预期,未检测到空引用风险)
- 9.0.202:编译报错(符合预期,正确识别空引用问题)
但Visual Studio的IntelliSense仍未识别问题,推测是使用9.0.103版本。卸载该SDK后VS无法编译,之后将Visual Studio从17.12.5升级到17.13.4,它自动安装了SDK 9.0.201,现在IntelliSense能识别错误,禁止编译运行有问题的代码,问题得以解决。目前本地有两个SDK版本:9.0.201(来自Visual Studio)、9.0.202。
内容的提问来源于stack exchange,提问作者Alex 75
相关产品推荐
相关产品推荐

