在 C# 中正确实现 F# Unit

Properly implement F# Unit in C#

此问题与 this one 中的 C#/F# 兼容性无关。

我想知道实现像 F# Unit 这样的类型而不是使用 void 的正确方法。

显然我会放弃这个结果,我不会把这个类型暴露给外界。

想知道一个空 class 是否可以模拟这个角色。

internal class Unit
{
}

例如在language-ext库中,作者使用了struct.

这个选择有什么好处吗?

我不确定从 C# 中定义 Unit 的最佳方式是什么。它可能与 F# 中的完成方式不同(因为在 F# 中,编译器以某种方式隐藏了用法)。

不过,其实可以在核心库中找到F#的实现unit

以下是有关 F# unit 实现的要点

  • 它以与 Rx 版本相同的方式实现 GetHashCodeEquals
  • 它是IComparable并且unit类型的所有值都相等
  • 最重要的是,它有一个私有构造函数,因此您不能创建新的 unit 值。它也没有 默认实例 (与 Rx 单元不同),因此在 F# 中,所有单元值实际上都表示为 null。然而,language/compiler通常隐藏了这个事实。

所以,听起来 F# 中的唯一区别是它使用 null 值。如果您想显式使用 unit,这可能不是最佳选择。但是,如果你有 Unit.Default 那么你最终定义了一个具有两个可能值的类型,因为它可以是 Unit.Defaultnull (所以它不是一个真正的单位!)

System.ValueTuple(没有通用参数)在 C# 中非常 unitThe source code 已开放。

我参考了这个Unit类型: https://github.com/louthy/language-ext/blob/main/LanguageExt.Core/DataTypes/Unit/Unit.cs

来自功能扩展库。