如果我传递对对象的引用,以下 f# 函数效果很好,但不会接受结构或基元:

let TryGetFromSession (entryType:EntryType, key, [<Out>]  outValue: 'T byref) =
    match HttpContext.Current.Session.[entryType.ToString + key] with
             | null -> outValue <- null; false
             | result -> outValue <- result :?> 'T; true

如果我尝试从 C# 调用它:
bool result = false;
TryGetFromSession(TheOneCache.EntryType.SQL,key,out result)

我得到 The Type bool must be a reference type in order to use it as a parameter 有没有办法让 F# 函数同时处理这两者?

最佳答案

问题在于 null 中的 outValue <- null 值将 'T 类型限制为引用类型。如果它有 null 作为有效值,则它不能是值类型!

您可以改用 Unchecked.defaultOf<'T> 来解决这个问题。这与 C# 中的 default(T) 相同,它返回 null(对于引用类型)或值类型的空/零值。

let TryGetFromSession (entryType:EntryType, key, [<Out>]  outValue: 'T byref) =
    match HttpContext.Current.Session.[entryType.ToString() + key] with
    | null -> outValue <- Unchecked.defaultof<'T>; false
    | result -> outValue <- result :?> 'T; true

10-06 11:11