C#项目不尊重F#type` [<noequality>]`属性

时间:2017-03-07 18:59:04

标签: c# f#

我有一个简单的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版。

1 个答案:

答案 0 :(得分:6)

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

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