gpt4 book ai didi

c# - F# "unmanaged"类型约束的行为

转载 作者:IT王子 更新时间:2023-10-29 04:39:20 28 4
gpt4 key购买 nike

F# 支持“非托管”的类型约束。这与“结构”约束之类的值类型约束不同。 MSDN notes非托管约束的行为是:

The provided type must be an unmanaged type. Unmanaged types are either certain primitive types (sbyte, byte, char, nativeint, unativeint, float32, float, int16, uint16, int32, uint32, int64, uint64, or decimal), enumeration types, nativeptr<_>, or a non-generic structure whose fields are all unmanaged types.

在进行平台调用时,这是一种非常方便的约束类型,我不止一次希望 C# 有一种方法可以做到这一点。 C# 没有这个约束。 C# 不支持可以在 CIL 中指定的所有约束。这方面的一个例子是枚举。在 C# 中,您不能这样做:

public void Foo<T>(T bar) where T:enum

但是,如果 C# 编译器在另一个库中遇到它,它会遵守“枚举”约束。 Jon Skeet 能够使用它来创建他的 Unconstrained Melody项目。

所以,我的问题是,F# 的“非托管”约束是否可以在 CIL 中表示,例如枚举约束,只是不在 C# 中公开,或者它是否像其他 F# 约束一样完全由 F# 编译器强制执行支持(如显式成员约束)?

最佳答案

我收到了一些反馈,请注意我不太了解 F#。请编辑我犯错的地方。首先了解基础知识,运行时实际上并不实现 F# 支持的约束。并且支持的不仅仅是 C# 所支持的。它只有 4 种类型的约束:

  • 必须是引用类型(C# 中的类约束,而不是 F# 中的结构)
  • 必须是值类型(C# 和 F# 中的结构约束)
  • 必须有一个默认构造函数(C# 中的 new() 约束,F# 中的 new)
  • 受类型限制。

然后 CLI 规范就这些约束如何在特定类型参数类型上有效设置特定规则,按 ValueType、Enum、Delegate、Array 和任何其他任意类型分割。

语言设计者可以在他们的语言中自由创新,只要他们遵守运行时可以支持的内容。他们可以自己添加任意约束,他们有一个编译器来执行它们。或者任意选择不支持运行时支持的一种,因为它不适合他们的语言设计。

只要泛型类型仅在 F# 代码中使用,F# 扩展就可以正常工作。所以 F# 编译器可以强制执行它。但它不能被运行时验证,如果这种类型被另一种语言使用,它根本不会有任何影响。约束在具有 F# 特定属性(Core.CompilationMapping 属性)的元数据中编码,另一种语言编译器知道 bean 它们应该意味着什么。当您在 F# 库中使用您喜欢的非托管约束时很容易看到:

namespace FSharpLibrary

type FSharpType<'T when 'T : unmanaged>() =
class end

希望我没听错。并在 C# 项目中使用:

class Program {
static void Main(string[] args) {
var obj = new Example(); // fine
}
}
class Foo { }
class Example : FSharpLibrary.FSharpType<Foo> { }

编译和执行都很好,实际上根本没有应用约束。不可能,运行时不支持。

关于c# - F# "unmanaged"类型约束的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27693910/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com