我試圖定義一個字符串的通用轉換操作符來枚舉,我想用這樣的:F#類型約束
let day = asEnum<DayOfWeek>("Monday")
但是這個實現:
let asEnum<'a, 'b when 'a: (new : unit -> 'a) and 'a : struct and 'a :> ValueType and 'a : enum<'b>> text =
match Enum.TryParse<'a>(text) with
| true, value -> Some value
| false, _ -> None
我只能用這樣的:
let day = asEnum<DayOfWeek,_>("Monday")
或本:
如果我從類型約束省略'a : enum<'b>
乾脆,我可以擁有它,因爲我想,但後來如果有人不指定類型,則默認爲int
,我真的不喜歡,我'd喜歡它給編譯時錯誤,就像我指定約束時一樣錯誤
也許有任何技巧只指定一個類型參數,並讓另一個類型參數被傳遞?有任何想法嗎?
聖牛。我甚至不知道這是有效的語法。我想如果你把它改成「a:enum」,那會給他他想要的東西。他也可以使用'let e:System.Reflection.BindingFlags option = asEnum「DeclaredOnly」'來避免警告。 –
Daniel
2013-02-27 15:55:33
爲什麼這個工作,但在'<' '>'之間放置相同的約束不? – Daniel 2013-02-27 15:57:46
@丹尼爾 - 我不認爲@ovastus希望'int'被迫,他希望在可能的情況下推斷它(它是)。 – kvb 2013-02-27 16:13:21