簡體   English   中英

混淆F#CodeDom的實現

[英]Confusing implementation of 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一個抽象方法和默認實現得到這樣一個奇怪的定義。 我在這里錯過了什么嗎?

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提供程序,但會生成很好的代碼。

這看起來很好。

new() as this = {}

它只是一個空的默認構造函數,默認實現的抽象方法是如何在F#中定義虛方法(參見規范的第8.14.2節 )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM