你如何 return 从 f# 到 c# 的空元组?

How do you return a null Tuple from f# to c#?

我有这个类型正确的 C# 函数:

static System.Tuple<int,int> f(int n) { 
  switch (n) { 
    case 0: return null;
    default: return System.Tuple.Create(n,n+1);
  }
}

我尝试在 F# 中重新实现它:

let f = function 
| 0 -> null 
| n -> System.Tuple.Create(n, n+1)

类型检查器不同意,但是:

error FS0001: The type '('a * 'b)' does not have 'null' as a proper value.

如何在 F# 中重新实现原始 C# 函数 f

请注意,虽然这看起来像问题“如何在 F# 中 return null”(答案:不要,使用 Option),但我们问的是稍微不同的“我们如何 return null from F# for C# consumers”(不能使用选项,下面有帮助的答案)。

如果您需要它与 C# 互操作,您可以像这样使用 Unchecked.Defaultof

let f = function
    | 0 -> Unchecked.Defaultof<_>
    | n -> (n, n + 1)

但是,在 F# 中强烈建议不要使用空值,如果互操作性不是您主要关心的问题,则使用选项更为自然:

let f = function
    | 0 -> None
    | n -> Some (n, n + 1)