在C#中正确实现F#单元

gss*_*der 8 c# f# functional-programming unit-type

这个问题是不是C#/ F#的兼容性在这一个.

我想知道实现像F#Unit这样的类型代替使用的正确方法void.

显然我会放弃这个结果,我不会将这种类型暴露给外界.

想知道一个空类是否可以冒充这个角色.

internal class Unit
{
}
Run Code Online (Sandbox Code Playgroud)

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

这个选择有什么好处吗?

Tom*_*cek 9

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

但是,您实际上可以unit在核心库中找到F#的实现:

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

  • 它实现GetHashCodeEquals以同样的方式到Rx版本
  • 它是IComparable和所有unit类型的值相等
  • 最重要的是,它有一个私有构造函数,因此您无法创建新unit值.它也没有默认实例(与Rx单元不同),所以在F#中,所有单位值实际上都表示为null.但是,语言/编译器通常隐藏这一事实.

所以,听起来F#的唯一区别在于它使用了这个null值.如果要unit明确使用,这可能不是最佳选择.但是,如果你有,Unit.Default那么你最终定义了一个具有两个可能值的类型,因为它可以是Unit.Default或者null(因此它实际上不是一个单位!)


Luk*_*ský 7

System.ValueTuple(没有泛型参数)是C# 中的一个非常重要的单元源代码是开放的。