3

我有一个扩展方法

type System.Int32 with
    member this.Thousand() = this * 1000

但它需要我这样写

(5).Thousand()

我很想摆脱这两个括号,首先将其设为属性而不是方法(为了学习)我如何将其设为属性?

4

3 回答 3

8

Jon 的回答是这样做的一种方法,但对于只读属性,还有一种更简洁的方法来编写它:

type System.Int32 with
    member this.Thousand = this * 1000

此外,根据您的喜好,您可能会发现写起来5 .Thousand(注意多余的空间)比(5).Thousand(但您不能只写5.Thousand,甚至写)更令人愉悦5.ToString()

于 2013-07-30T19:46:08.907 回答
3

我真的不知道 F#(可耻!),但根据这篇博文,我希望:

type System.Int32 with  
    member this.Thousand 
      with get() = this * 1000

怀疑这不会让你从第一组括号中解脱出来(否则 F#可能会尝试将整个内容解析为文字),但它应该可以帮助你处理第二组括号。

就个人而言,我不会将这种东西用于“生产”扩展,但它对于您使用大量值的测试代码很有用。

特别是,我发现在日期周围有扩展方法很不错,例如19.June(1976),作为一种非常简单、易于阅读的构建测试数据的方法。但不适用于生产代码:)

于 2013-07-30T18:59:25.647 回答
2

它并不漂亮,但如果你真的想要一个适用于任何数字类型的函数,你可以这样做:

let inline thousand n =
  let one = LanguagePrimitives.GenericOne
  let thousand = 
    let rec loop n i =
      if i < 1000 then loop (n + one) (i + 1)
      else n
    loop one 1
  n * thousand

5.0 |> thousand
5 |> thousand
5I |> thousand
于 2013-07-30T19:47:24.127 回答