Dot-Net

F# 是否從 Object 繼承每種類型?

  • February 15, 2011

問題很簡單,而且。雖然答案很明顯,但我不得不面對一個奇怪的情況,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嗎?

你忘記了括號:

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

在省略括號的原始程式碼中,您試圖覆蓋屬性 ToString。

德斯科已經用你的片段解釋了這個問題。

F# 的行為與 C# 類似,這意味著所有類型都繼承自Object,儘管值類型的行為有些微妙。當您有一個值類型的變數時,它不能直接被視為Object並且需要被裝箱(到繼承自 .NET 的引用類型Object)。

這可能會導致類型推斷出現一些令人困惑的錯誤:

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

編寫此程式碼時,您會收到一條錯誤消息:

錯誤 FS0008:此執行時強製或類型測試從類型 ‘a 到隨機涉及基於此程序點之前的資訊的不確定類型。某些類型不允許執行時類型測試。需要進一步的類型註釋。

如果一切從嚴格意義上繼承Object,那麼 F# 編譯器應該能夠將任何類型參數轉換為Object,但這是不允許的。問題是值類型需要裝箱,所以你需要寫match box x with ....

引用自:https://stackoverflow.com/questions/4993156