Запутанная реализация F # CodeDom - PullRequest
3 голосов
/ 02 января 2011

Я пытаюсь создать класс и метод в нем. Для C # и VB поставщики CodeDom выдают предопределенный вывод, но поставщик F # CodeDom выдает следующее. Мне интересно, почему.

exception ReturnException8abef2fbb2404165b4b8690157bd3a49 of obj
exception ReturnNoneException8abef2fbb2404165b4b8690157bd3a49

type
    // Hello

    test = class
        new() as this =
            {
            }
        abstract my_method : unit -> unit
        default this.my_method  () =
            ()
    end

Игнорируя исключение (я думаю, что провайдер все еще немного глючит), мне интересно, почему я получаю такое странное определение с new() as this, абстрактным методом и реализацией по умолчанию. Я что-то здесь упускаю?

Ответы [ 2 ]

4 голосов
/ 02 января 2011

Код, сгенерированный генератором CodeDOM, странный, но в основном это корректный код F #, который компилируется. Как указывает kvb, определение конструктора является действительным. Было бы лучше, если бы провайдер CodeDOM генерировал код с использованием неявного синтаксиса, но это не сработало бы, если бы у вас было несколько конструкторов.

Что касается исключений, они используются для эмуляции императивной конструкции return (как в C #). Например, вы не можете напрямую написать следующее в F #:

for(int i = 0; i < 10; i++)
  if (i == 5) return;

Таким образом, генератор CodeDOM использует исключение для эмуляции return и try .. with для его обработки.

Обычный стиль кодирования в F # просто немного отличается от C # / VB, а структуры данных CodeDOM были разработаны в основном для C # / VB. Если вы хотите сгенерировать хороший код F #, лучше написать собственный генератор кода. Кроме того, кто-то может создать провайдера F # CodeDOM, который не будет поддерживать все функции, но будет генерировать красивый код.

3 голосов
/ 02 января 2011

Это выглядит хорошо для меня.

new() as this = {}

- это просто пустой конструктор по умолчанию, а абстрактный метод с реализацией по умолчанию - это способ определения виртуального метода в F # (см. раздел 8.14.2 спецификации ).

...