我正在尝试创建一个类和一个方法。对于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
,一个抽象方法和一个默认实现得到这样一个奇怪的定义。我在这里错过了什么吗?
答案 0 :(得分:4)
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提供程序,但会生成很好的代码。
答案 1 :(得分:3)