我不确定为什么F#似乎允许在没有任何构造函数的情况下定义类.我的意思是,实例化该类的对象是不可能的.语言规范不应该将此视为非法行为吗?
例如,我可以定义类
type myClass =
class
member this.x = 0
end
Run Code Online (Sandbox Code Playgroud)
myClass 似乎有类型
type myClass =
member x: int
Run Code Online (Sandbox Code Playgroud)
但它不可实现.
根据我的经验,F#的面向对象特性有时不如C#表达的优雅.上述问题可以是一个例子; 另一个例子是自动实现的可变属性.
大多数人(包括我)似乎都不在乎,因为我们很少使用这些功能.F#的面向对象特性主要用于实现与其他.NET代码的互操作,因此虽然它们很有用,但它们并不是语言的重要组成部分.我的猜测是没有人想到实现编译器检查,因为它不会提供太多价值.一旦你尝试使用myClass,你就会注意到出了问题.
当您创建一个没有构造函数的类(换句话说,一个无法实例化的类)时,您基本上是在创建一个静态类*。
在 C# 中,您可以使用static关键字来允许编译器检查您是否有实例成员。在 F# 中,您在编译时没有这样的检查。
* 有点。静态类的正确定义是不能实例化或继承并且仅具有静态方法的类。