Как использовать объект С# из F #?

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

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

Что может быть неправильным? Я использовал mono для среды .NET.

Ответы

Ответ 1

попробовать

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

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

Ответ 2

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

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

Ответ 3

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

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