Generics 支持null的结构和引用类型的类型约束
是否可以将类型约束为支持null的结构或引用类型?类似于此函数的假设约束:Generics 支持null的结构和引用类型的类型约束,generics,f#,constraints,Generics,F#,Constraints,是否可以将类型约束为支持null的结构或引用类型?类似于此函数的假设约束: 让getOrDefault)键= 将d.TryGetValue(键)与 |对,v->v |我认为你不能在两个约束之间设置一个或。 通常当我需要像constraint1或constraint2或。。。或者,我要做的是创建重载: open System.Collections.Generic // unconstrained function let getOrDefaultG (d: IDictionary< _
让getOrDefault)键=
将d.TryGetValue(键)与
|对,v->v
|我认为你不能在两个约束之间设置一个或。
通常当我需要像constraint1或constraint2或。。。或者,我要做的是创建重载:
open System.Collections.Generic
// unconstrained function
let getOrDefaultG (d: IDictionary< _ , 'T>) key =
match d.TryGetValue(key) with
| true, v -> v
| _ -> Unchecked.defaultof<'T>
// individually constrained
let getOrDefaultS<'K,'T when 'T :struct> (d:IDictionary<'K,'T>) = getOrDefaultG d
let getOrDefaultN<'K,'T when 'T :null > (d:IDictionary<'K,'T>) = getOrDefaultG d
// overloads
type GetOrDefault = GetOrDefault with
static member ($) (GetOrDefault, d) = fun dummyArg -> getOrDefaultS d
static member ($) (GetOrDefault, d) = fun (dummyArg:unit) -> getOrDefaultN d
// the desired function
let inline getOrDefault d key = (GetOrDefault $ d) () key
open System.Collections.Generic
//无约束函数
让getOrDefaultG(d:IDictionary)键=
将d.TryGetValue(键)与
|对,v->v
|->Unchecked.defaultof(d:IDictionary)=getOrDefaultG d
如果有两个以上的重载,让GetOrDefaultn如何处理dummyArg
?好问题!我将添加另一个名为dummyArg2的参数,然后在第一个重载中我将不提供任何类型,在第二个重载中只提供dummyArg1,在第三个重载中同时提供这两个参数。我不明白我为什么要耍这些把戏。签名不同(bug?)。