Наследует ли F# каждый тип от Object?

вопрос простой и. хотя ответ очевиден, мне пришлось столкнуться со странной ситуацией, когда fsharp сказал мне что-то немного странное. Вот история:

вопрос в том, делает ли F# автоматически каждый тип наследует Object класса? Я полагаю, что да, и я уверен в этом, потому что было бы так много осложнений, если бы это не было так.

но вот факт. Я писал этот фрагмент кода:--6-->

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

Ну, fsharp компилятор сказал мне, что неправильно использовать overrid, потому что он не находит никакого метода с именем ToString для переопределения. Я так скомпилировал этот код:

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

и все работало нормально. мммммм, что происходит??? Разве FSharp не должен наследовать каждый объект из Object?

3 ответов


вы забыли parens:

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

в исходном коде с опущенными parens вы пытались переопределить свойство ToString.


Деско уже объяснил probelm с вашим фрагментом.

F# ведет себя так же, как C#, что означает, что все типы наследуются от Object, хотя и с немного тонким поведением типов значений. Когда у вас есть переменная типа значения, ее нельзя напрямую рассматривать как Object и должны быть упакованы (в ссылочный тип .NET, который наследуется от Object).

это может вызвать некоторые путаные ошибки с выводом типа:

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

когда вы пишете это, вы получаете сообщение об ошибке:

ошибка FS0008: это принуждение среды выполнения или тест типа от типа " A до Random включает неопределенный тип, основанный на информации до этой точки программы. Тесты типов среды выполнения не разрешены для некоторых типов. Необходимы дополнительные аннотации типов.

если все унаследовано от Object в строгом смысле, тогда компилятор F# должен иметь возможность конвертировать любой параметр типа в Object, но это запрещено. Проблема эти типы значений нуждаются в боксе, поэтому вам нужно написать match box x with ....


нет. Есть типы, которые не являются производными от Object. Интерфейсы, например, являются типами, которые не являются производными от object. Смотри http://blogs.msdn.com/b/ericlippert/archive/2009/08/06/not-everything-derives-from-object.aspx Для больше детали.