gpt4 book ai didi

generics - 支持 null 的结构和引用类型的类型约束

转载 作者:行者123 更新时间:2023-12-04 05:36:46 24 4
gpt4 key购买 nike

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

let getOrDefault<'T when ('T : struct) or ('T : null)> (d: IDictionary<_, 'T>) key =
match d.TryGetValue(key) with
| true, v -> v
| _ -> Unchecked.defaultof<'T>

该函数不应与 F# 类型一起使用,除非标有 [<AllowNullLiteral>] .

最佳答案

我不认为你可以放 or两个约束之间。
通常当我需要类似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 是我用来创建两个不同签名并使其编译的技巧。

关于generics - 支持 null 的结构和引用类型的类型约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11836807/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com