如何满足编译器消除警告0052?

时间:2015-04-21 13:27:26

标签: f# compiler-warnings

我希望满足编译器警告级别5.所以我在一个文件中有32个警告FS0052 已复制该值以确保此操作不会改变原始文件

我已经关注了与此警告相关的唯一SO post,但由于我的类型是由Microsoft生成的类型提供程序,因此我无法将字段标记为可变为安静警告。加上一些实际上不应该被改变的可变的东西看起来像是一个黑客而不是修复。

的示例:

  1. Nullable .GetValueOrDefault()
  2. Nullable .ToString()
  3. Guid .toString()
  4. 我认为的任何类型的struct方法调用
  5. 从正确的功能角度处理此警告的建议方法是什么?

2 个答案:

答案 0 :(得分:4)

不确定您是否仍然感兴趣。

在我看来,当不确定方法调用是否会破坏原始实例的状态时,编译器会发出警告(这应该主要来自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

答案 1 :(得分:0)

  

从正确处理此警告的建议方法是什么?   功能观点?

我发现了很多关于这个问题的问题,但我发现这个特殊的问题还没有找到。在确定了许多这样的警告后,这就是我的结论。

我相信没有单一的解决方案。 (除非你想用编译器指令或其他东西来控制整个地方的警告,我当然不想这样做。我有一种感觉你同意我的意见,提出了警告等级为5。)

第一个选项

经常有另一种编码方式,无需借助中间值或其他复杂表达式。

例如,在这种情况下使警告静音

myStruct.someField <- myRecord.SomeField.ToString()

只需将其更改为

即可
myStruct.someField <- string myRecord.SomeField

第二个选项

如果你没有找到一个功能或某种方法来轻易地改写你的方式,并且这是一个特殊情况,在你的源中经常重复,那么就有可能创建一个或多个你可以使用的功能在这些情况下,为了使警告沉默。

例如,我使用此函数而不是GetValueOrDefault。

let valueOrDefault (v: 'a Nullable) = if v.HasValue then v.Value else Unchecked.defaultof<'a>

第三个选项

如果您只有一个特定案例或几乎没有类似案例,那么使用中间值可能是使警告静音的最简单方法。我倾向于评论这些案件中冗长的原因。