Сумма вычисляется в соответствии с арифметическими правилами стандарта IEEE 754.
Если один из операндов бинарного оператора имеет тип с плавающей запятой, а второй операнд имеет целый тип, то в этом случае вычисление операции выполняется следующим образом:
· Если один из операторов имеет целый тип, он преобразуется к типу с плавающей запятой, соответствующему типу второго операнда.
Пример.
var i = +5; // unary plus
var i1 = 5 + 5; // addition
var i2 = 5 + .5; // addition
var i3 = "5" + "5"; // string concatenation
var i4 = 5.0 + "5"; // string concatenation
Если один операнд при сцеплении строк равен null, то подставляется пустая строка. Иначе любой нестроковый аргумент преобразуется в свое строковое представление путем вызова виртуального метода ToString, наследуемого от типа bject.
Операция вида x – y
В контексте checked если разность выходит за пределы диапазона типа результирующего значения, возникает исключение System.OverflowException. В контексте unchecked о переполнениях не сообщается, и все старшие биты, выходящие за пределы диапазона результирующего значения, отбрасываются. Пример.
Данный пример будет работать, т.к. uint+ uint дадут в результате выражения тип uint, но вместо -1 получим в результате 4294967295.
static void Main(string[] args)
{
uint A = 10;
uint B = 9;
Console.WriteLine(B-A);
}
var i = -5;
var i1 = 5 - 5;
var i2 = 5 - .5;
У всех унарных и бинарных операторов есть стандартная реализация, доступная автоматически в любом выражении. В дополнение к стандартным реализациям объявление operator в классах и структурах позволяет использовать пользовательские реализации. Пользовательские реализации операторов всегда имеют приоритет над предопределенными реализациями операторов.
К унарным операторам, допускающим перегрузку, относятся:
+ - ! ~ ++ -- true false
К бинарным операторам, допускающим перегрузку, относятся:
+ - * / % & | ^ << >> == != > < >= <=
Невозможна перегрузка операторов доступа к членам, вызова методов или операторов =, &&, ||, ??, ?:, =>, checked, unchecked, new, typeof, default, as и is.
При перегрузке бинарного оператора связанный оператор присваивания (если он есть) также неявно перегружается. Например, при перегрузке оператора * также выполняется перегрузка оператора *=. Оператор присваивания (=) нельзя перегрузить. При присваивании всегда происходит простое побитовое копирование значения в переменную.
Перегрузка операций приведения типов, например (T)x, осуществляется путем предоставления пользовательских преобразований.
Доступ к элементу, например a[x], не считается оператором, допускающим перегрузку.
В пользовательских объявлениях операторов по крайней мере один из параметров всегда должен иметь тип класса или структуры, в котором содержится объявление оператора.Таким образом, у пользовательского оператора не может быть такой же сигнатуры, что и у стандартного оператора.
Стандартные операторы сложения:
int operator +(int x, int y); uint operator +(uint x, uint y); long operator +(long x, long y); ulong operator +(ulong x, ulong y);
у пользовательского оператора не может быть такой же сигнатуры, что и у стандартного оператора, поэтому пример работать не будет:
using System;
namespace ConsoleApplication3
{
class Program
{
public static int operator +(int a, int b)
{
return a + 2*b;
}
static void Main(string[] args)
{
Int32 a = 5;
Int32 b = 6;
Int32 c = a + b;
Console.WriteLine(c);
}
}
}
Ошибка. Тип одного из параметров бинарного оператора должен быть вмещающим
Пример.
Типы, определенные пользователем, могут вызвать перегрузку оператора +.