作为在F#中重写我的C#代码的一部分,我遇到了一个我不知道如何最好地处理从C#服务返回的System.String类型的默认值的情况。
我希望做的C#相当于:
var myCSharpString = CSharpService.GetCSharpString() ?? "";
简单地说,如果GetCSharpString返回的字符串为null或default(string),我希望将其设置为" "代替。
但是,如果我尝试在F#中执行以下语句会发生什么?
let myFSharpString = CSharpService.GetCSharpString
如果GetCSharpString返回null或default(字符串),myFSharpString将是F#中字符串的默认值(即:"")?或者我必须明确地进行空检查,例如:
let myFSharpString =
match CSharpService.GetCSharpString with
| val when val = Unchecked.defaultof<System.String> -> ""
| val -> val
我发现自己多次做这样的检查,而我根本无法克服这样一个简单任务需要多少代码的事实。
在处理返回System.String的C#服务时,有人可以告诉我F#中是否真的需要这样的空检查吗?
更新:
我没有问过与F#的选项类型相结合的?? - 运算符,正如之前在this帖子中所回答的那样。相反,我问的是如何在F#上下文中处理字符串的C#空值。
我尝试过的另一个看似可能的answer就是创建一个自定义运算符,例如:
let inline (|??) (a: 'a Nullable) b = if a.HasValue then a.Value else b
然而,这会产生编译错误,因为F#解释了GetCSharpString的返回值,类型为&#39; string&#39;,它在F#中是NotNullable。
答案 0 :(得分:0)
定义一个函数和一个单例活动模式:
let safeStr = function
| null -> String.Empty
| x -> x
let (|SafeStr|) = safeStr
您现在可以使用以下功能:
let myFSharpString = safeStr <| CSharpService.GetCSharpString()
...或活动模式:
let processCSharpString (SafeStr x) =
// x is never null :)