混淆F#CodeDom的实现

时间:2011-01-02 11:12:42

标签: f# codedom

我正在尝试创建一个类和一个方法。对于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 个答案:

答案 0 :(得分:4)

CodeDOM生成器生成的代码很奇怪,但它主要是有效的F#代码编译。正如kvb所指出的,构造函数的定义是有效的。如果CodeDOM提供程序使用隐式语法生成代码会更好,但是如果你有多个构造函数则不会很好。

对于异常,这些异常用于模拟命令式return构造(如在C#中)。例如,您无法在F#中直接编写以下内容:

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

因此CodeDOM生成器使用异常来模拟returntry .. with来处理它。

F#中通常的编码风格与C#/ VB略有不同,CodeDOM数据结构主要是为C#/ VB设计的。如果你想生成漂亮的F#代码,那么编写自己的代码生成器可能是个更好的主意。或者,有人可以创建不支持所有功能的F#CodeDOM提供程序,但会生成很好的代码。

答案 1 :(得分:3)

这对我来说很好。

new() as this = {}

只是一个空的默认构造函数,默认实现的抽象方法是如何在F#中定义虚方法(参见section 8.14.2 of the spec)。