【问题标题】:Does F# inherit every type from Object?F# 是否从 Object 继承每种类型?
【发布时间】:2011-02-14 14:14:23
【问题描述】:

这个问题很简单。虽然答案很明显,但我不得不面对一个奇怪的情况,fsharp 告诉我一些有点奇怪的事情。故事是这样的:

问题是:F# 会自动让每个类型都继承Object 类吗?我想是的,我很确定这一点,因为如果不是这样,就会有很多并发症。

但这是一个事实。 我正在写这段代码:

type MyType =
   val myval: int
   override self.ToString = "Hello MyType"

好吧,fsharp 编译器告诉我使用覆盖是不正确的,因为他没有找到任何名为 ToString 的方法来覆盖。我就这样编译了这段代码:

type MyType =
   val myval: int
   member self.ToString = "Hello MyType"

一切正常。 mmmmmm 怎么回事??? FSharp 不应该从Object 继承每个对象吗?

【问题讨论】:

    标签: .net inheritance f# overriding


    【解决方案1】:

    你忘记了括号:

    type MyType =
       val myval: int
       override self.ToString() = "Hello MyType"
    

    在省略括号的原始代码中,您试图覆盖属性 ToString。

    【讨论】:

    • +1 但我只是在寻找答案中的“是”,而我只是在盯着自己看。
    • 您的回答修复了 OP 的初始代码,但没有回答为什么第二个版本有效的问题。
    • 第二个版本有效,因为没有什么能阻止人们创建一个新的ToString 属性。
    • 是的,正确,谢谢 desco... 它不将其解释为函数 ut 作为值 :)
    • OKOK 相当第二个作品,因为它不是一个函数成员,而是一个值成员......这就是为什么它没有告诉我放置覆盖,因为它没有隐藏任何东西:)跨度>
    【解决方案2】:

    Desco 已经用你的 sn-p 解释了这个问题。

    F# 的行为与 C# 类似,这意味着所有类型都继承自 Object,尽管值类型的行为有些微妙。当你有一个值类型的变量时,不能直接把它当作Object处理,需要装箱(到继承自Object的.NET引用类型)。

    这可能会导致类型推断出现一些令人困惑的错误:

    let foo x = 
      match x with 
      | :? System.Random as rnd -> rnd.Next()
      | _ -> 0
    

    当你写这个时,你会收到一条错误消息:

    错误 FS0008:从类型 'a 到 Random 的运行时强制或类型测试涉及基于此程序点之前的信息的不确定类型。某些类型不允许运行时类型测试。需要更多类型注释。

    如果严格意义上从Object 继承的所有内容,那么F# 编译器应该能够将任何类型参数转换为Object,但这是不允许的。问题是值类型需要装箱,所以需要写match box x with ...

    【讨论】:

      【解决方案3】:

      没有。有些类型不是从对象派生的。例如,接口是不从对象派生的类型。详情请参阅http://blogs.msdn.com/b/ericlippert/archive/2009/08/06/not-everything-derives-from-object.aspx

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-24
        • 2011-08-28
        • 2021-07-12
        • 1970-01-01
        • 2023-03-22
        • 2018-02-19
        • 2019-06-25
        相关资源
        最近更新 更多