Метод по умолчанию с кортежными параметрами для класса F # - PullRequest
2 голосов
/ 29 апреля 2011

Почему этот класс F # не компилируется (с VS2010):

type Base =
    abstract func : (int * int) -> int

    default this.func (x : int, y : int) : int =
        x + y

Реализация func по умолчанию вызывает эту ошибку компиляции:

Error   9   This override takes a different number of arguments to the corresponding abstract member

Если я изменю его, он будет членом:

type Base =
    abstract func : (int * int) -> int

    member this.func (x : int, y : int) : int =
        x + y

Затем он компилируется (хотя я полагаю, что теперь у абстрактного функционала отсутствует реализация), и тип второго функционала совпадает с первым.

В соответствующем примечании почемуРазве компилятору не требуется, чтобы второе определение Base имело атрибут AbstractClass?

Ответы [ 2 ]

5 голосов
/ 29 апреля 2011

Просто избавьтесь от скобок:

type Base =
    abstract func : int * int -> int

    default this.func (x : int, y : int) : int =
        x + y

Вы даже можете немного его укоротить:

default this.func(x, y) = x + y
4 голосов
/ 29 апреля 2011

Чтобы получить первую версию для компиляции, вам нужно написать:

type Base1 =
    abstract func : (int * int) -> int
    default this.func( (x : int, y : int) ) : int =
        x + y

У меня нет ссылки на спецификацию, но F # обычно не компилирует члены как методы, которые принимают кортежи какаргументы.Обычно он использует .NET / C # дружественный метод с несколькими аргументами.Член abstract обеспечивает это представление, поэтому член default должен сделать то же самое, используя более явный синтаксис.

Вы правы в понимании второго типа - второе объявление является абстрактным классом снереализованный абстрактный метод (и другой метод с таким же именем).Для этого F # требует атрибута AbstractClass (он не требует этого для вышеприведенного, потому что он не абстрактный).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...