Dot-Net
F# 是否從 Object 繼承每種類型?
問題很簡單,而且。雖然答案很明顯,但我不得不面對一個奇怪的情況,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 ....