在开发F#应用程序时,我的类型包含Lazy<'T>
类型的属性。
显然,F#处理属性的语法糖(与C#方式相反)的方式的一个有趣的副作用(原谅双关语)是属性的getter和setter可能返回/接受不同类型。 (至少,当我编写利用这种观察的代码时,Visual Studio并没有抱怨。)
例如,我这样做是有利的:
let lazyValue = lazy 0
member this.Value
with get () =
lazyValue.Value
and set _lazyVal =
lazyValue <- _lazyVal
...这样,返回 int
,但只接受 Lazy<int>
。
我想知道的是以这种方式做事的理论,惯用和实际的反对意见。这是一个F#势利的人会嗤之以鼻吗?这个(面向对象的实现)明显违反了一些函数式编程经验法则吗?这种方法是否已被证明会在大规模应用中引起问题?如果是这样,为什么/如何?
答案 0 :(得分:5)
也许这是一个错误,“Visual Studio不会因为[你]编写利用这种观察的代码而抱怨”。见Using F# Option Type in C#
对链接问题的答案中的评论说明:
从规范的8.13.1节:如果属性成员同时具有getter和setter,并且两者都不是索引器,那么getter和setter的签名必须表示相同的属性类型