2010-10-04 59 views
17

有沒有辦法限制一個類型參數從另一個派生?如何約束另一個類型參數

type Foo<'T, 'U when 'U :> 'T> = 
    member x.Bar() : 'T = upcast Unchecked.defaultof<'U> 

此代碼產生以下錯誤:

錯誤1無效約束:用於約束的類型是密封的,這意味着該約束只能通過滿足至多一個溶液

錯誤2使用此類型參數的方式將其限制爲始終爲'T'

錯誤3從'T到'T0類型的靜態強制涉及基於不確定類型在這個節目點之前的信息。某些類型不允許使用靜態強制。需要進一步的類型註釋。

警告4此構造會導致代碼不如類型註釋所示的通用代碼。類型變量'U被限制爲類型''T'。

回答

20

沒有:(。這是F#的此刻(在我看來)最不幸的限制之一。見規格的Solving Subtype Constraints段,其中指出,

的新限制表單類型:>「b再次求解類型='b

這真是一個恥辱,因爲否則根本解決F#的缺乏通用方差:

let cvt<'a,'b when 'a :> 'b> (s:seq<'a>) : seq<'b> = // doesn't compile 
    s |> box |> unbox 
+0

有沒有我們可以投票選擇包含此功能的地方? – Martin 2013-12-30 23:01:26

+2

找到它,它在這裏:http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/3942302-provide-covariance-contravariance-language-support – Martin 2013-12-30 23:10:12

+0

用戶語音https:// fslang的新鏈接。 uservoice.com/forums/245727-f-language/suggestions/5927125-solve-subtype-constraints-of-the-form-ab-when – 2015-08-07 04:08:13

相關問題