Наследует ли 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 Для больше детали.