or
2 つの制約の間に挟むことはできないと思います。通常、constraint1、constraint2、...、constraintN のようなものが必要な場合は、オーバーロードを作成します。
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
注: dummyArg は、2 つの異なる署名を作成してコンパイルするために使用するトリックです。