将C#默认字符串正确分配给F#变量
本文关键字:分配 变量 默认 字符串 | 更新日期: 2023-09-27 17:59:31
在F#中重写C#代码时,我遇到了这样的情况:我不知道如何最好地处理从C#服务返回的System.String类型的默认值。
我想做的C#等价物是:
var myCSharpString = CSharpService.GetCSharpString() ?? "";
简单地说,如果GetCSharpString返回的字符串为null或default(字符串),我希望将其设置为"。
然而,如果我尝试在F#中执行以下语句,会发生什么?
let myFSharpString = CSharpService.GetCSharpString
在GetCSharpString返回null或default(string)的情况下,myFSharpString会是F#中字符串的默认值吗(即:")?或者我必须明确地进行空检查,例如:
let myFSharpString =
match CSharpService.GetCSharpString with
| val when val = Unchecked.defaultof<System.String> -> ""
| val -> val
我发现自己已经做过几次这样的检查了,我根本无法忘记这样一个简单的任务需要多少代码。
有人能告诉我,在处理返回System.String的C#服务时,F#中是否真的需要这样的null检查吗?
更新:
我不是在问什么-运算符与F#的Option类型的组合,正如之前在本文中所回答的那样。相反,我问的是如何在F#上下文中处理字符串的C#null值。
我尝试过的另一个看似可能的答案是,制作一个自定义运算符,例如:
let inline (|??) (a: 'a Nullable) b = if a.HasValue then a.Value else b
然而,这会导致编译错误,因为F#将GetCSharpString的返回值解释为"string"类型,而在F#中该类型为NotNullable。
定义一个函数和一个用例活动模式:
let safeStr = function
| null -> String.Empty
| x -> x
let (|SafeStr|) = safeStr
您现在可以使用以下任一功能:
let myFSharpString = safeStr <| CSharpService.GetCSharpString()
或活动模式:
let processCSharpString (SafeStr x) =
// x is never null :)