向我隐藏现有值,如:
中所述 Shadowing and Nested function
immutable in F#
f# duplicate definition
FSharp for fun and profit comment
似乎违背了不变性和类型安全的概念,这使得F#如此强大。 F#中的阴影在different中比在C#中起作用。我花了很长时间才发现我的代码中的一个错误是由于在同一范围内无意中隐藏了一个名称。有没有办法让VS中的阴影值有编译器警告?
我知道在某些情况下它可能很有用。例如Checked Aritmetics。
答案 0 :(得分:4)
我使用阴影的一个地方是,如果没有提供任何值,则将可选参数解析为默认值。
member x.Foo(?myFlag: bool) =
let myFlag = defaultArg myFlag false
...
如果我们没有阴影,F#Interactive,它现在的实现方式,几乎完全没有功能。
答案 1 :(得分:3)
暗影有利有弊。我也遇到了由于胖子阴影的努力而导致的错误。从正面看,@JoelMueller指出,它可以帮助保持变量空间的清洁。
阴影错误与可变变量错误根本不同。他们是拼写错误的品种。它们更容易分析:历史信息丢失最小化到词典背景与环境背景。也就是说,通过阴影,您可以通过精神堆栈展开来干净地跟踪绑定的值,而变量突变可以创建基本上是getos(跳转到地址)。
实际上,阴影仍然消除了整个类的错误。你不会从远处遇到任何"幽灵般的行为"。也就是说,您不会遇到在闭包中捕获的变量或在嵌套作用域中相对于当前作用域修改的变量的问题。