2010-10-10 39 views
13

Tôi có mã C# sau.Cách sử dụng đối tượng C# từ F #?

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

Và tôi đã đưa ra mã F # có tên testcs.fs để sử dụng đối tượng này.

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

Khi tôi chạy lệnh sau

 
fsc -r:MyMath.dll testcs.fs 

tôi đã thông báo lỗi này.

 
/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 

Điều gì có thể sai? Tôi đã sử dụng mono cho môi trường .NET.

Trả lời

15

thử

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

Arith trong mã của bạn là tên lớp, bạn không thể mở nó như namespace. Có thể bạn đang bối rối với khả năng mở các mô-đun F # để các chức năng của nó có thể được sử dụng mà không cần trình độ chuyên môn

+0

Nó hoạt động tốt. Cảm ơn. – prosseek

7

Arith là một lớp và không phải là không gian tên nên bạn không thể mở nó. Bạn có thể làm điều này thay vì:

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

Nó hoạt động tốt. Cảm ơn. – prosseek

3

Khi mở, bạn chỉ có thể mở các không gian tên là các mô-đun (tương tự như từ khóa sử dụng C#). Không gian tên được định nghĩa với từ khóa không gian tên và hành động giống nhau trong cả C# và F #. Tuy nhiên, các mô-đun trong thực tế chỉ là các lớp tĩnh, chỉ có các thành viên tĩnh - F # chỉ ẩn nó khỏi bạn.

Nếu bạn nhìn vào mã F # với bộ phản xạ, bạn sẽ thấy rằng mô-đun của bạn đã được biên dịch dưới dạng lớp tĩnh. Vì lý do này, bạn chỉ có thể sử dụng các lớp tĩnh làm mô-đun trong F #, và trong ví dụ của bạn, lớp không tĩnh, vì vậy để sử dụng nó, bạn phải tạo một cá thể đối tượng - giống như bạn làm trong C#.

Các vấn đề liên quan