Ответ 1
Вы можете выставить любое valid имя функции F # на С# как любое имя функции С# с использованием атрибут CompiledName:
namespace Library1
module Test =
[<CompiledName("Whatever")>]
let ``add a and b`` x y = x + y
а затем в С#:
using Library1;
...............
System.Console.WriteLine(Test.Whatever(2,2));
FOLLOW-UP 03/05/2016 в комментарии от NickL применяется, по крайней мере, к F # 3.1:
Переход от функций к членам приводит к некоторым "ifs и buts".
Для начала атрибут CompiledName
не компилируется с помощью member
, если используется с чистым namespace
. Для простой компиляции требуется использовать в пределах module
.
При использовании в module
и методе декорирования member
записи F # он работает отлично, независимо от того, как выглядит содержимое между двумя тиками. Однако, когда украшающее свойство member
записи F # CompiledName
видится кросс-сборкой, только если содержимое между двойными тиками напоминает какое-то правовое значение:
module M
type MyRecord =
{ myField: string }
[<CompiledName "Whatever">]
member x.``Blah Blah blah``() = x.myField
[<CompiledName "Another">]
member x.``ABC`` = x.myField
а затем из С# выполняется следующее:
var recInC = new M.MyRecord("Testing...");
Console.WriteLine(recInC.Whatever());
Console.WriteLine(recInC.Another);
Такие несоответствия требуют потенциального issues.