在我发表 comments https://github.com/fsharp/fslang-suggestions/issues/349#issuecomment-1124206512

为方便读者,此处复制了示例代码:

let spanOfOptString(os: Option<string>) =
  match os with Some(s) -> s.AsSpan()
                | None -> raise(Exception())

错误FS0412:类型实例化涉及byref类型.这是通用IL规则所不允许的.

因此,F#将一个无返回函数raise键入为Exception -> 'a,其中包含一个free 'a("OCaml方式"),而类型变量恰好绑定到byref类型ReadOnlySpan,这是非法的.我觉得我是因为我没有犯下的罪行而受到惩罚...

我可以找到一个解决办法

let checkedSpanOfString(os: Option<string>) =
  match os with Some(s) -> s.AsSpan()
                | None -> raise(Exception())  // 'a = unit
                          ReadOnlySpan.Empty  // both arms: ReadOnlySpan<char>

https://sharplab.io/#gist:32b520574fde97de8d7389ab04f64bc4

但我觉得这有点难看.我认为我们不应该期望all个byref类型可以使用.Empty个?(我想除了(ReadOnly)Span/Memory之外,我从来没有使用过任何其他byref类型,但那是另一个故事)

While F# core team doesn't seem to be moving towards introducing the bottom type to the language (which is perhaps a sensible engineering decision),
does anybody have a better alternative to make this work?

Update

@chadnt的答案可以内联以获得

let checkedSpanOfString(os: Option<string>) =
  let s = match os with Some(s) -> s
                        | None -> raise(Exception())
  s.AsSpan()

https://sharplab.io/#gist:a5eab805c539c45048b4072fa7b096c5

它的IL看起来比我的原始版本简单得多

推荐答案

看起来,首先分配字符串值似乎可以解决这个问题.

open System

let valueOrRaise = function
    | Some v -> v
    | None -> raise(Exception())

let checkedSpanOfString (os: string option) =
    let s = valueOrRaise os
    s.AsSpan()

https://sharplab.io/#gist:2ca959f498be87f1b52212182af237b4

和FSI:

> (checkedSpanOfString (Some "foo")).ToString();;
val it: string = "foo"

.net相关问答推荐

Docker失败文件找不到

使用托管身份而不是检测密钥配置Application Insights

无法使用 int.Parse 从字符串转换值

在.NET C#中截断整个单词的字符串

如何在没有抽象基类的情况下强制覆盖后代中的方法?

string.Format 如何处理空值?

如何中止任务,如中止线程(Thread.Abort 方法)?

如何解决请确保文件可访问并且它是有效的程序集或 COM 组件?

ASP.NET Core 等效于 ASP.NET MVC 5 的 HttpException

如何结合 ||条件语句中的运算符

析构函数、dispose 和 finalize 方法的区别

如何从 XDocument 获取 Xml 作为字符串?

Moq - 不可覆盖的成员不能用于设置/验证表达式

如何过滤具有多个条件的 Directory.EnumerateFiles?

如何获得 Bin 路径?

C# (.NET) 设计缺陷

带有嵌套控件的设计模式

.NET 图形库?

有没有一种简单的方法来判断 .NET Framework 版本?

嵌套捕获组如何在正则表达式中编号?