Перегрузка строкового оператора C#

Хорошие дневные помощники -

Каков правильный путь (исключая аргумент того, желательно ли это) перегружать строковые операторы <>, <= и> =?

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

namespace System
{
   public partial class String
   {
       public static Boolean operator <(String a, String b)
       {
           return a.CompareTo(b) < 0;
       }

       public static Boolean operator >(String a, String b)
       {
           return a.CompareTo(b) > 0;
       }
   }

}

9
задан Scott Baker 6 April 2010 в 19:20
поделиться

6 ответов

Строка - это запечатанный класс. Вы не можете наследовать от него, и без исходного источника String вы не можете скомпилировать его частичный класс. Даже если у вас есть исходный код (это возможно через Reflector или через загрузку символов Visual Studio), у вас все равно будут проблемы, поскольку это первоклассный гражданин во время выполнения.

Вам действительно нужны операторы <и> в строке? Если да ... почему бы просто не использовать методы расширения ?

public static bool IsLessThan(this string a, string b) 
{ 
    return a.CompareTo(b) < 0; 
} 

public static bool IsGreaterThan(this string a, string b) 
{ 
    return a.CompareTo(b) > 0; 
}


// elsewhere...
foo.IsLessThan(bar); // equivalent to foo < bar
18
ответ дан 4 December 2019 в 06:00
поделиться

Невозможно заменить любое встроенное поведение компилятора вашим собственным. Вы не можете переопределить существующие встроенные операторы для сравнений, преобразований, арифметики и т. Д. Это по замыслу; это для того, чтобы кто-то мог прочитать ваш код и знать, что int x = M (); int y = x + 2; выполняет целочисленную арифметику, в отличие, скажем, от форматирования жесткого диска.

Вы можете объяснить, почему вы хотите это сделать? Возможно, есть лучший способ делать то, что вы хотите.

16
ответ дан 4 December 2019 в 06:00
поделиться
  • Вы можете ' t имеют частичный класс для строки, потому что сам класс строки не является частичным и, следовательно, не будет работать с вашим частичным классом.

  • Строка запечатана, поэтому вы можете наследовать от нее, а затем перегрузить оператор.

Короче говоря, увы, вы не можете делать то, что вам нужно делать.

Не знаю, что именно вы пытаетесь сделать, я не могу предложить хорошей альтернативы. Но взгляните на методы расширения , которые часто подходят для определенных ситуаций. Не говоря уже о том, должны ли вы :), вы можете добавить к строковому классу метод с именем IsGreaterThan и возвращать true или false, как хотите. Это хорошо, потому что вы можете дать методу расширения имя, которое проясняет его смысл, сохраняет существующие операторы в тактильном состоянии (что в любом случае у вас нет выбора) и позволяет создавать быстрый / простой код.

3
ответ дан 4 December 2019 в 06:00
поделиться

Простой ответ: вы не можете; нет возможности изменить операторы для другого класса. Частичные классы разрешены только для классов, которые оба объявлены частичные во всех файлах и , определенных в одной сборке .

10
ответ дан 4 December 2019 в 06:00
поделиться

Вы не можете напрямую перегрузить операторы> = и <=, но вы можете добиться того же результата, перегрузив> и == по отдельности.

Ваш код кажется мне правильным, за исключением того факта, что вы пропустили перегрузку для ==.

Кажется, я был неправ, однако вы всегда можете вернуться к рефлексии. Я думаю, если вы немного покопаетесь и взломаете, вы можете заставить его работать с отражением, чтобы расширить класс, поскольку отражение позволяет добавлять функции или менять тела функций во время выполнения.

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

1
ответ дан 4 December 2019 в 06:00
поделиться

Вы имеете в виду класс System.String? Это невозможно в C#. Вы не можете добавить операторы расширения к существующему классу. Хотя это очень востребованная функция.

5
ответ дан 4 December 2019 в 06:00
поделиться
Другие вопросы по тегам:

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