Как использовать объект C # из F #? - PullRequest
17 голосов
/ 10 октября 2010

У меня есть следующий код C #.

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

И я предложил код F # с именем testcs.fs, чтобы использовать этот объект.

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.

Ответы [ 3 ]

16 голосов
/ 10 октября 2010

try

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

Arith в вашем коде это имя класса, вы не можете открыть его как пространство имен.Возможно, вас смущает возможность открывать модули F #, чтобы его функции можно было использовать без квалификации

7 голосов
/ 10 октября 2010

Поскольку Arith является классом, а не пространством имен, вы не можете его открыть. Вы можете сделать это вместо:

open MyMath
let x = Arith().Add(10,20)
3 голосов
/ 10 октября 2010

С помощью open вы можете открывать только пространства имен модулей (аналогично C # с использованием ключевого слова). Пространства имен определяются с помощью ключевого слова namespace и действуют одинаково как в C #, так и в F #. Однако на самом деле модули - это просто статические классы, имеющие только статические члены - F # просто скрывает это от вас.

Если вы посмотрите на код F # с отражателем, вы увидите, что ваш модуль был скомпилирован как статический класс. По этой причине вы можете использовать статические классы только как модули в F #, и в вашем примере этот класс не является статическим, поэтому для его использования необходимо создать экземпляр объекта - так же, как в C #. 1003 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...