c# - 可以将 C# 扩展方法添加到 F# 类型吗?

标签 c# f# extension-methods

我有某人的 F# 库,里面有一个类型:

module HisModule

type hisType {
    a : float;
    b : float;
    c : float;
}

我在C#中使用它,我想给它添加一个“ToString()”方法,以方便调试。

但以下似乎不起作用:

public static class MyExtensions
{
    public static string ToString(this HisModule.hisType h)
    {
        return String.Format("a={0},b={1},c={2}", h.a, h.b, h.c);
    }
}
....
var h = new hisType();
Console.WriteLine(h.ToString());  // prints "HisModule+hisType"

为什么不呢?

最佳答案

正如其他人所指出的,对象上的 ToString 始终比您的扩展方法更匹配。您可能应该更改扩展方法的签名;更改名称可能是正确的方法。

另外:你说这个东西的目的是方便调试。在那里覆盖 ToString 可能是错误的事情; ToString 可能用于除调试之外的其他用途。我会倾向于制作我自己的特别命名的方法,其名称清楚地反射(reflect)了该方法的目的。

如果您正在创建一个新类型并希望在调试器中有特殊的显示行为,最简单的方法是使用 Debugger Display Attributes .

如果你真的想以一种有趣的方式显示复杂的数据结构,考虑写一个 Debugger Visualizer .

关于c# - 可以将 C# 扩展方法添加到 F# 类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8333212/

相关文章:

c# - 为什么 F# 比 C# 慢这么多? (质数基准)

c# - 在 int 上使用扩展方法

未见 C# 扩展方法

c# - 如何计算这个奇数方法的时间复杂度

c# - C# 中的 URL 编码

f# - 增强了可区分联合的调试信息

f# - MathNumerics.LinearAlgebra Matrix.mapRows 维数问题

c# - DateTime 是原始类型吗?

C#:如何根据提供者格式将字符串转换为日期?

c# - 有没有办法指定不同命名空间中的同名扩展方法使用哪种扩展方法?