F# 如何使编译器满意以消除警告0052?
我希望满足编译器警告级别5的要求。因此,我在一个文件FS0052中有32个警告。该值已被复制,以确保原始值不会因此操作而发生变化 我遵循了唯一一个似乎与此警告相关的选项,但由于我的类型是由Microsoft生成的类型提供程序,因此我不能只标记字段mutable来消除警告。再加上,让一些实际上不应该变异的东西变得易变似乎是一种黑客行为,而不是修复 示例:F# 如何使编译器满意以消除警告0052?,f#,compiler-warnings,F#,Compiler Warnings,我希望满足编译器警告级别5的要求。因此,我在一个文件FS0052中有32个警告。该值已被复制,以确保原始值不会因此操作而发生变化 我遵循了唯一一个似乎与此警告相关的选项,但由于我的类型是由Microsoft生成的类型提供程序,因此我不能只标记字段mutable来消除警告。再加上,让一些实际上不应该变异的东西变得易变似乎是一种黑客行为,而不是修复 示例: Nullable.GetValueOrDefault() 可空.ToString() Guid.toString() 我相信任何类型的struc
.GetValueOrDefault()
.ToString()
.toString()
从正确的功能角度来看,处理此警告的建议方法是什么 不确定您是否仍然感兴趣 在我看来,编译器在不确定方法调用是否将破坏原始实例的状态时发出警告(这应该主要来自F#之外的任何库) 在我的例子中,将值显式复制到变量中通常可以减轻警告。例如:
open System
// generate the warning due to "ToString()"
let DirSeparator = Path.DirectorySeparatorChar.ToString()
// no warning
let ExplicitCopy = let x = Path.DirectorySeparatorChar in x.ToString()
let Alternative = sprintf "%c" Path.DirectorySeparatorChar
从适当的角度处理此警告的建议方法是什么
功能视角
我发现了很多关于这个问题的问题,但这个问题我在别的地方找不到。在修正了许多这样的警告之后,这是我的结论
我认为没有单一的解决办法。(除非你想用编译器指令或其他什么东西使警告静音,我当然不想这样做。我感觉你同意我的看法,因为你已经将警告级别提高到了5级。)
第一选项
通常还有另一种编码方式,而不必求助于中间值或其他复杂表达式
例如,在这种情况下使警告静音
myStruct.someField <- myRecord.SomeField.ToString()
myStruct.someField tbh:我会用#nowarn
忽略这一点,在这种情况下,我不相信#nowarn
在F中起作用,哦,相信它会起作用;)哦,在F#my badit中实际工作的4个版本中有一个应该注意,#nowarn
到目前为止只在F#中的文件或程序集级别工作。我必须承认,自我写这篇文章以来,FS0052一直让我非常恼火,我不得不在一个项目中在项目级别上对它进行沉默。这是我所知道的唯一一个警告,与其说是帮助,不如说是讨厌。我希望有人能更改编译器,以便更好地分析警告是否正确。
myStruct.someField <- string myRecord.SomeField
let valueOrDefault (v: 'a Nullable) = if v.HasValue then v.Value else Unchecked.defaultof<'a>