gpt4 book ai didi

C# 项目不遵守 F# 类型 `[]` 属性

转载 作者:太空狗 更新时间:2023-10-30 00:48:54 25 4
gpt4 key购买 nike

我有一个简单的 F# 类型如下:

(* Num.fsi *)
namespace FsLib

module Num =
[<NoEquality>]
type t

val of_int : int -> t
val to_int : t -> int

实现就像你想象的那样微不足道,它只是一个案例具有底层的受歧视联合 int .现在在一个C#项目中同样的解决方案我有以下代码:

// CsTool.cs
using System;
using FsLib;

namespace CsTool {
class MainClass {
public static void Main(string[] args) {
Num.t n1 = Num.of_int(1);
Num.t n2 = Num.of_int(1);

Console.WriteLine(n1.Equals(n2));
}
}
}

问题是,这是在打印 False而不是编译失败或抛出运行时错误。知道为什么这个 C# 调用代码是忽略 [<NoEquality>]属性?

顺便说一下,我在 Mac 上的 Xamarin Studio 社区中运行它,版本 6.1.2,目标是 .NET Framework 版本 4.5.1。

最佳答案

一般来说,C# 语言不会处理很多 F# 特定的功能。大多数 F# 类型,从 F# 使用时,都具有不同的功能。例如,F# 类型(默认情况下)无法设置为 null,但在 C# 中,您可以声明并将它们设置为 null,因为 C# 语言不会了解任何 F# 特定结构。正如您所发现的,C#(和其他 CLR 语言)会忽略相等性和比较保证、可为 null 的保证和功能等。

在实践中,这很少成为问题,因为大多数人倾向于将 F# 类型保留在他们的 F# 代码库中,并从 BCL 或 C# 项目中提取类型并将它们转换为 F# 类型(以增加安全保证) “在 API 边界”。

关于C# 项目不遵守 F# 类型 `[<NoEquality>]` 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42656143/

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