如果我传递对对象的引用,以下 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