【问题标题】:How to use C# object from F#?如何使用 F# 中的 C# 对象?
【发布时间】:2010-10-10 19:19:10
【问题描述】:

我有以下 C# 代码。

namespace MyMath {
    public class Arith {
        public Arith() {}
        public int Add(int x, int y) {
            return x + y;
        }
    }
}

我想出了名为 testcs.fs 的 F# 代码来使用这个对象。

open MyMath.Arith
let x = Add(10,20)

当我运行以下命令时

fsc -r:MyMath.dll testcs.fs

我收到此错误消息。

/Users/smcho/Desktop/cs/namespace/testcs.fs(1,13):错误 FS0039:命名空间“Arith”是 没有定义的 /Users/smcho/Desktop/cs/namespace/testcs.fs(3,9):错误 FS0039:值或构造函数 “添加”未定义

可能出了什么问题?我将单声道用于 .NET 环境。

【问题讨论】:

    标签: c# f#


    【解决方案1】:

    试试

    open MyMath
    let arith = Arith() // create instance of Arith
    let x = arith.Add(10, 20) // call method Add
    

    Arith 在你的代码中是类名,你不能像命名空间一样打开它。可能您对打开 F# 模块的能力感到困惑,因此无需限定即可使用其功能

    【讨论】:

      【解决方案2】:

      由于Arith 是一个类而不是命名空间,因此您无法打开它。你可以这样做:

      open MyMath
      let x = Arith().Add(10,20)
      

      【讨论】:

        【解决方案3】:

        使用 open,您只能打开命名空间是模块(类似于 C# using 关键字)。 命名空间是使用命名空间关键字定义的,在 C# 和 F# 中的作用相同。然而,模块实际上只是静态类,只有静态成员——F# 只是对你隐藏了这些。

        如果您查看带有反射器的 F# 代码,您会发现您的模块已被编译为静态类。 出于这个原因,您只能在 F# 中将静态类用作模块,并且在您的示例中,该类不是静态的,因此为了使用它,您必须创建一个对象实例 - 就像您在 C# 中所做的那样。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-06-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-11-23
          • 2016-12-30
          相关资源
          最近更新 更多