можно ли определить метод расширения, который одновременно является оператором? Я хочу для фиксированного класса добавить возможность использовать известный оператор, который фактически не может быть применен. В этом конкретном случае я хочу сделать следующее:
somestring++; //i really know that this string contains a numeric value
И я не хочу распространять преобразования типов для всего кода. Я знаю, что могу создать класс-оболочку над строкой и определить этот оператор, но я хочу знать, возможно ли такое, чтобы избежать поиска и замены каждого объявления строки на MySpecialString.
Отредактировано: как большинство из них говорят, строка запечатан, поэтому наследование невозможно, поэтому я изменяю слово "производный" на "оболочку", моя ошибка.
Как показано в других ответах, это не может быть сделано непосредственно. Но что при необходимости в нем скажите, что Вы хотите к [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 относительно неявного преобразования).