Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics 支持null的结构和引用类型的类型约束_Generics_F#_Constraints - Fatal编程技术网

Generics 支持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< _

是否可以将类型约束为支持null的结构或引用类型?类似于此函数的假设约束:

让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?)。