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

Dav*_*d H 3 c# extension-methods f#

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

module HisModule

type hisType {
    a : float;
    b : float;
    c : float;
}
Run Code Online (Sandbox Code Playgroud)

我在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"
Run Code Online (Sandbox Code Playgroud)

任何想法为什么不呢?

Eri*_*ert 11

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

而且:你说这个东西的目的是为了方便调试.重写ToString可能是错误的做法; ToString可能用于除调试之外的其他内容.我倾向于制作我自己特别命名的方法,其名称清楚地反映了该方法的目的.

如果要创建新类型并希望在调试器中具有特殊的显示行为,则最简单的方法是使用调试器显示属性.

如果您想真正想要以有趣的方式显示复杂的数据结构,请考虑编写一个Debugger Visualizer.


pho*_*oog 6

你的问题的答案是"是".但是,您的示例不会成功,因为方法解析在找到时会成功object.ToString(),因此编译器永远不会查找扩展方法.尝试使用其他名称:

public static class MyExtensions 
{ 
    public static string Foo(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.Foo());
Run Code Online (Sandbox Code Playgroud)