【问题标题】:Can a C# extension method be added to an F# type?可以将 C# 扩展方法添加到 F# 类型吗?
【发布时间】:2011-11-30 21:32:11
【问题描述】:

我有某人的 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"

有什么想法为什么不呢?

【问题讨论】:

标签: c# f# extension-methods


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    您的问题的答案是“是”。但是,您的示例没有成功,因为方法解析在找到 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());
    

    【讨论】:

      【解决方案3】:

      我认为你不能这样做,因为ToString() 始终存在,在 CLR 世界的任何对象中。 查看Eric Lippert answer

      【讨论】:

      • 我过去一直在枚举类型上添加 ToString() 扩展方法,所以我认为这绝对不是问题,解决方案应该最后依靠 Object.ToString()。跨度>
      • @DavidGrenier:重载决议总是优先考虑基类型上的适用候选方法而不是扩展方法。你能证明 C# 不这样做的情况吗?如果是这样,您发现了一个错误,我想知道它。谢谢!
      • 我尝试在 LINQPad 中重复实验,但没有成功。我可能只是在这里疯了。这是在以前的工作场所完成的,证据显然是反对的。
      【解决方案4】:

      您可以创建一个覆盖 ToString 的包装器类型(带有隐式转换)。

      class MyType {
          private readonly hisType _hisType;
          private MyType(hisType hisType) {
              _hisType = hisType;
          }
          public static implicit operator MyType(hisType hisType) {
              return new MyType(hisType);
          }
          public override string ToString() {
              return String.Format("a={0},b={1},c={2}", _hisType.a, _hisType.b, _hisType.c);
          }
      }
      
      hisType y;
      MyType x = y;
      

      【讨论】:

        猜你喜欢
        • 2010-09-19
        • 2011-08-30
        • 1970-01-01
        • 2012-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多