Можно ли добавить метод расширения C # к типу F #? - PullRequest
3 голосов
/ 01 декабря 2011

У меня есть чья-то библиотека 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"

Есть идеи, почему нет?

Ответы [ 4 ]

11 голосов
/ 01 декабря 2011

Как уже отмечали другие, объект ToString всегда будет лучше соответствовать вашему методу расширения. Вам, вероятно, следует изменить сигнатуру вашего метода расширения; изменение имени, вероятно, правильный путь.

Более того: вы сказали, что целью этой вещи было облегчить отладку. Переопределение ToString может быть неправильным решением; ToString может использоваться для чего-то другого, кроме отладки. Я был бы склонен создать свой собственный метод с особым именем, имя которого четко отражает назначение метода.

Если вы создаете новый тип и хотите иметь специальное поведение отображения в отладчике, проще всего использовать Атрибуты отображения отладчика .

Если вы хотите по-настоящему увлекательно отобразить сложную структуру данных, подумайте о написании Отладчика Visualizer .

.
6 голосов
/ 01 декабря 2011

Ответ на ваш вопрос "да".Однако ваш пример не удастся, потому что разрешение метода завершается успешно, когда он находит 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 голосов
/ 01 декабря 2011

Я думаю, вы не можете сделать это, так как ToString() всегда есть, в любом объекте мира CLR.Проверьте Эрик Липперт ответ .

0 голосов
/ 01 декабря 2011

Вы можете создать тип оболочки (с неявным преобразованием), который переопределяет 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;
...