C # операторы перегрузки для примитивных типов - PullRequest
0 голосов
/ 07 июля 2019

Возможно ли перегрузить операторы, такие как ||, && и ! для таких типов, как int и float?

Пример:

float a, b; int c;
//instead of this:
return Convert.ToBoolean(a) || Convert.ToBoolean(b) && !Convert.ToBoolean(c);
//do this:
return a || b && !c;

Ответы [ 3 ]

2 голосов
/ 07 июля 2019

Вы можете использовать побитовые операторы для достижения этого при использовании целых чисел.

Вы бы использовали & вместо &&, | вместо || и ~ вместо!.

Это будет выглядеть так:

    int a, b, c;
    //instead of this:
    //return Convert.ToBoolean(a) || Convert.ToBoolean(b) && !Convert.ToBoolean(c);
    //do this:
    return (a | b & ~c) != 0;

Но в случае с плавающей точкой вы не можете использовать эти операторы.

Изменить: Подумав об этом, я думаю, вы не сможете этого сделать. Все ненулевые значения оцениваются как истина, кроме нуля - ложь. Помня об этом, и использование двух ненулевых значений с использованием побитового значения и (&) может привести к нулю. Например: a = 1, b = 2 -> a & b = 0. Также побитовое отрицание (~) будет оцениваться только до нуля, если применяется к -1. ~ 1 будет иметь значение, отличное от нуля, при преобразовании в логическое значение будет иметь значение true.

2 голосов
/ 07 июля 2019

Для ИЛИ у вас есть символ |. Например:

return a | b; 

Вернет true, если a ИЛИ b было true. В противном случае он вернул бы false.

Кроме того, у вас есть оператор &, с помощью которого вы можете сделать это:

return a & b;

Это вернет true, если оба a И b, где true. В противном случае он вернул бы false. Я рекомендую вам ознакомиться с документацией здесь для большего количества операторов:

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/boolean-logical-operators

И, конечно, как говорится в заголовке веб-сайта (логические операторы), это невозможно сделать для целых чисел и чисел с плавающей точкой, поскольку они не имеют никакого значения. Я имею в виду, почему вы хотите вернуть 2 or 4 & 5? Это просто не имеет никакой ценности. Посмотрите здесь, если найдете что-нибудь:

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/statements-expressions-operators/overloadable-operators

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

Кроме того, @SohaibJundi сказал (отличная работа), вместо ! вы используете это:

return ~a;

Это вернет противоположное значение a. Это означает, что если a было true, то возвращалось бы false, а если оно было false, то возвращалось бы true.

Надеюсь, это поможет!

1 голос
/ 07 июля 2019
  1. от https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/introduction#expressions

    Перегрузка оператора позволяет пользовательским реализациям оператора быть указан для операций , где один или оба операнда имеют пользовательский класс или тип структуры. Перегрузка примитивного оператора (C #)

  2. от https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/boolean-logical-operators#operator-overloadability

    Пользовательский тип не может перегружать условные логические операторы && и ||. Однако, если пользовательский тип перегружает true и ложные операторы и / или | оператор определенным образом, && или || Операция, соответственно, может быть оценена для операндов этого типа.

для получения дополнительной информации https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/expressions#user-defined-conditional-logical-operators

...