Можно ли определить метод оператора расширения?

можно ли определить метод расширения, который одновременно является оператором? Я хочу для фиксированного класса добавить возможность использовать известный оператор, который фактически не может быть применен. В этом конкретном случае я хочу сделать следующее:

   somestring++;  //i really know that this string contains a numeric value

И я не хочу распространять преобразования типов для всего кода. Я знаю, что могу создать класс-оболочку над строкой и определить этот оператор, но я хочу знать, возможно ли такое, чтобы избежать поиска и замены каждого объявления строки на MySpecialString.

Отредактировано: как большинство из них говорят, строка запечатан, поэтому наследование невозможно, поэтому я изменяю слово "производный" на "оболочку", моя ошибка.

13
задан Matt 2 October 2019 в 11:40
поделиться

1 ответ

Как показано в других ответах, это не может быть сделано непосредственно. Но что при необходимости в нем скажите, что Вы хотите к [1 111], улучшают StringBuilder как

void Main()
{
    var log = (StringBuilder)"Hello ";
    log += "World!";
    log += "\nThis example shows how to extend StringBuilder";
    log.ToString().Dump();
}

, как можно достигнуть этого (т.е. использование + оператор вместо sb.Append(str);)?

<час>

Ответ: В этом случае, Вы не можете сделать этого непосредственно, но что можно сделать:

Выполнение это в Примечании DotNetFiddle

void Main()
{
    var log = (StrBuilder)"Hello "; // same as: "Hello ".ToStrBuilder();
    log += "World!";
    log += "\nThis example shows how to extend StringBuilder";
    log.ToString().Dump();
}

public static class Extensions
{
    public static StrBuilder ToStrBuilder(this string str)
    {
        return new StrBuilder(str);
    }   
}

public class StrBuilder
{
    private StringBuilder sb;

    public StrBuilder()
    {
        sb = new StringBuilder();
    }

    public StrBuilder(string strB)
    {
        sb = new StringBuilder(strB);
    }

    public static implicit operator StrBuilder(string self)
    {
        return new StrBuilder(self);
    }

    public static StrBuilder operator +(StrBuilder sbA, string strB)
    {       
        return sbA.Append(strB);
    }

    public StrBuilder Append(string strB)
    {
        sb.Append(strB);
        return this;
    }

    public override string ToString()
    {
        return sb.ToString();
    }
}

: Вы не можете наследоваться StringBuilder, потому что это - запечатанный класс, но можно ли записать класс, что "поля" StringBuilder - который является, что сделано здесь (благодаря ответ IanNorton относительно неявного преобразования).

0
ответ дан 1 December 2019 в 20:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: