gpt4 book ai didi

.net - 为什么 `System.Void` 与 `unit` 类型不同?

转载 作者:行者123 更新时间:2023-12-04 22:18:32 24 4
gpt4 key购买 nike

F# Types Docs said that:

Unit Type: Describes the unit type, a type that has one value and that is indicated by (); equivalent to void in C# and Nothing in Visual Basic.


它说它们是相等的,但为什么下面的比较返回假?
typedefof<System.Void> = typedefof<unit>;;
val it : bool = false

最佳答案

好吧,它们并不真正等同。您发布的报价有点误导。

F# 类型 unit相当于 C# 关键字 void (不是类型 System.Void !)因为类型和关键字都用于声明不返回任何内容的函数:

// F#
let f (x:int) : unit = ...

// C#
void f( int x ) { ... }

这就是您的报价所要说的,但是等效性就止于此了。

在 C# void不是真正的类型。这是一个用于声明无返回方法的关键字,但您不能在类型位置使用它 - 例如你不能拥有 void变量、参数、类型参数等。这就是为什么我们有一个单独的委托(delegate) Action而不是仅仅使用 Func<void> .

类型 System.Void完全是另一种动物:它的存在只是为了支持反射,但它与 void 不同。 ,一路 System.Int32int 相同.

另一方面,在 F# 中,类型 unit与其他任何类型一样,主要只是一种常规类型。它甚至还有一个 definition in the standard library .是的,编译器确实在某些特殊情况下对其进行了特殊处理,但这仅用于优化和互操作,在语言级别是不可见的。
因此, unit可以在任何类型位置使用 - 参数、变量等。这意味着,例如,F# 对于不返回任何内容的函数不需要特殊的函数类型,它可以使用 int -> unit .

关于.net - 为什么 `System.Void` 与 `unit` 类型不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48247667/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com