f#属性vs. c#属性

本文关键字:属性 vs | 更新日期: 2023-09-27 18:18:50

在开发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

…使得Value 返回一个int,但只接受一个Lazy<int>

我想知道的是这种做法在理论上、习惯上和实践上的反对意见。这是一个f#势利小人会嗤之以鼻的事情吗?这(面向对象实现)是否明显违反了函数式编程的一些经验法则?这种方法是否已经被证明在大规模应用程序中会导致问题?如果有,为什么/怎么做?

f#属性vs. c#属性

也许这是一个"Visual Studio不会抱怨,因为[你]编写的代码利用了这个观察结果"的bug。参见在c#中使用f#选项类型

对链接问题注释的回答的评论:

来自规范第8.13.1节:如果一个属性成员同时具有getter和setter,且两者都不是索引器,那么getter和setter的签名必须暗示相同的属性类型