Перегрузка оператора строки C # - PullRequest
8 голосов
/ 06 апреля 2010

G'Day Mates -

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

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

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;
       }
   }

}

Ответы [ 6 ]

17 голосов
/ 06 апреля 2010

String - запечатанный класс. Вы не можете наследовать от него, и без исходного источника для 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
16 голосов
/ 07 апреля 2010

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

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

10 голосов
/ 06 апреля 2010

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

5 голосов
/ 06 апреля 2010

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

3 голосов
/ 06 апреля 2010
  • У вас не может быть частичного класса для строки, потому что сам строковый класс не является частичным и, следовательно, не будет работать с вашим частичным классом.

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

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

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

1 голос
/ 06 апреля 2010

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...