有没有办法约束一个类型参数从另一个派生?
type Foo<'T, 'U when 'U :> 'T> =
member x.Bar() : 'T = upcast Unchecked.defaultof<'U>
Run Code Online (Sandbox Code Playgroud)
此代码产生以下错误:
错误1无效约束:用于约束的类型是密封的,这意味着约束只能通过最多一个解决方案来满足
错误2此类型参数的使用方式将其限制为始终为"T"
错误3从类型'T到'T0的静态强制涉及基于此程序点之前的信息的不确定类型.某些类型不允许静态强制.需要进一步的类型注释.
警告4此构造使代码不如类型注释所指示的那样通用.类型变量'U已被约束为类型''T'.
kvb*_*kvb 23
No :(.这是目前F#中最不幸的限制之一(在我看来).请参阅规范的解决子类型约束条款,其中指出
表单类型的新约束:>'b再次解析为type ='b.
这真是一个耻辱,因为否则我们可以解决F#缺乏通用差异:
let cvt<'a,'b when 'a :> 'b> (s:seq<'a>) : seq<'b> = // doesn't compile
s |> box |> unbox
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1731 次 |
最近记录: |