我有一个简单的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版。
答案 0 :(得分:6)
通常,C#语言不会处理许多F#特定功能。大多数F#类型,在使用F#时具有不同的功能。例如,F#类型(默认情况下)无法设置为null
,但在C#中,您可以声明并将它们设置为null
,因为C#语言不了解任何特定的F#结构体。正如您所发现的那样,C#(和其他CLR语言)都忽略了相等和比较保证,可空保证和功能以及更多内容。
实际上,这很少是一个问题,因为大多数人倾向于将F#类型保留在他们的F#代码库中,并从BCL或C#项目中提取类型并将它们转换为F#类型(以添加安全保证) “在API边界”。