将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。

将C#默认字符串正确分配给F#变量

定义一个函数和一个用例活动模式:

let safeStr = function
    | null -> String.Empty
    | x -> x
let (|SafeStr|) = safeStr

您现在可以使用以下任一功能:

let myFSharpString = safeStr <| CSharpService.GetCSharpString()

或活动模式:

let processCSharpString (SafeStr x) =
    // x is never null :)