gpt4 book ai didi

F# 将一个 C# 方法传入另一个需要 Func<> 参数的 C# 方法

转载 作者:行者123 更新时间:2023-12-02 15:20:05 25 4
gpt4 key购买 nike

在 C# dll 中,我有一个方法,它采用 func 参数:

public static AttrDiffRule Create<T>(string a_attr, string b_attr, Func<IAttrProxy,IAttrProxy,T,bool> parametricRule, T ruleParam, string desc = null)

以及一些预定义的默认方法:

public static bool NumberEqualsWithTolerance(IAttrProxy a, IAttrProxy b, double tolerance)

现在,当在 C# 中使用它时,我可以编写以下代码并且它可以工作:

var tmp = DefaultRules.Create("fds", "fds", DefaultRules.NumberEqualsWithTolerance, 10.0);

但是,在 F# 中:

let attrRule = DefaultRules.Create("fd","fdsa", DefaultRules.NumberEqualsWithTolerance, 89.)

给出语法错误:“错误 FS0002 该函数接受太多参数,或者在不需要函数的上下文中使用”

将 C# 静态方法传递到需要 F# 中的 Func<> 的参数的正确方法是什么?

实际传递函数而不是 lambda 包装器非常重要,因为 Create 方法的工作是使用参数函数的 MethodInfo,而该方法信息被 lambda 包装器隐藏。

传入的函数没有重载,也尝试过指定类型,例如

(DefaultRules.NumberEqualsWithTolerance : Func<IAttrProxy,IAttrProxy,float,bool>)

最佳答案

这是 F# 为您考虑得非常周到的一个案例 - 帮助您编写更惯用的 F#。

在 .NET 中,您实际上并未传入函数(就好像它是成员引用一样),而是传入 Func<> 类型的委托(delegate)对象。 。当具有必要的类型信息时,委托(delegate)对象的构造由 C# 隐式完成。

如果我们将其重构为实际的委托(delegate)类型,我们可以更清楚地看到这一点:

public delegate bool ParametricRule<T>(IAttrProxy a, IAttrProxy b, T value);

public static AttrDiffRule Create<T>(string a_attr, string b_attr, ParametricRule<T> parametricRule, T ruleParam, string desc = null)
{
return default;
}

如果您尝试构造 ParametricRule在 F# 中,您会看到它的类型是:

ParametricRule(IAttrProxy -> IAttrProxy -> 'a -> bool)

基本原理是,这样您就可以使用常规 F# 函数,而不是一些非 F#ish 元组输入函数。这就是为什么它不适用于您的情况。因为您试图将 C# 的元组版本直接扔回它。

因此,如果您将 C# 实现重构为:

protected static bool NumberEqualsWithToleranceImpl(IAttrProxy a, IAttrProxy b, float tolerance)
{
return default;
}

public static ParametricRule<float> NumberEqualsWithTolerance => NumberEqualsWithToleranceImpl;

您会发现它的工作方式与您期望的一样,无论是在 F# 还是 C# 中。

let attrRule = DefaultRules.Create("fd","fdsa", DefaultRules.NumberEqualsWithTolerance, 89.0f) //compiles, yay!

关于F# 将一个 C# 方法传入另一个需要 Func<> 参数的 C# 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60376320/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com