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

时间:2015-06-25 09:40:04

标签: c# string f# interop

作为在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。

1 个答案:

答案 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 :)