在 C# 中实现具有单元返回类型的 F# 接口成员



>假设我在 F# 中定义了以下接口:

type IFoo<'T> = 
  abstract member DoStuff : 'T -> unit

如果我在 C# 中实现这一点,我需要方法签名是:

public void DoStuff<T>(T arg) {...}

我真正想做的是引用FSharp.Core,然后使用:

public Unit DoStuff<T>(T arg) {...}

这将简化其他代码,因为我不必处理操作与 Func。我猜没有任何干净的方法来实现这一目标?一些邪恶的黑客怎么样?

Unit转换为void被烘焙到编译器中。F# Core 中有一个 FuncConvert 类,用于在 FSharpFuncConverter 之间进行转换。定义一个类似的类来将Action<T>转换为Func<T, Unit>怎么样?

static class ActionConvert {
    private static readonly Unit Unit = MakeUnit();
    public static Func<T, Unit> ToFunc<T>(Action<T> action) {
        return new Func<T, Unit>(x => { action(x); return Unit; });
    }
    private static Unit MakeUnit() {
        //using reflection because ctor is internal
        return (Unit)Activator.CreateInstance(typeof(Unit), true);
    }
}

然后你可以做

var foo = new Foo<int>();
var func = ActionConvert.ToFunc<int>(foo.DoStuff);

您甚至可以放弃Unit实例并返回null

相关内容

  • 没有找到相关文章

最新更新