2010-10-10 71 views
13

我有以下的C#代码。如何使用F#中的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): error FS0039: The namespace 'Arith' is 
not defined 

/Users/smcho/Desktop/cs/namespace/testcs.fs(3,9): error FS0039: The value or constructor 
'Add' is not defined 

什么可能是错的?我使用单一的.NET环境。

回答

15

尝试

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

ARITH在你的代码的类名,你不能打开它就像命名空间。可能你对打开F#模块的能力感到困惑,所以它的功能可以不经限定地使用。

+0

它工作正常。谢谢。 – prosseek 2010-10-10 19:36:23

7

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

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

它工作正常。谢谢。 – prosseek 2010-10-10 19:34:56

3

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

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