Assignment operators (C# reference)

The assignment operator = assigns the value of its right-hand operand to a variable, a property, or an indexer element given by its left-hand operand. The result of an assignment expression is the value assigned to the left-hand operand. The type of the right-hand operand must be the same as the type of the left-hand operand or implicitly convertible to it.

The assignment operator = is right-associative, that is, an expression of the form

a = b = c

is evaluated as

a = (b = c)

The following example demonstrates the usage of the assignment operator with a local variable, a property, and an indexer element as its left-hand operand:

var numbers = new List<double>() { 1.0, 2.0, 3.0 };

numbers.Capacity = 100;
// Output:
// 4
// 100

int newFirstElement;
double originalFirstElement = numbers[0];
newFirstElement = 5;
numbers[0] = newFirstElement;
// Output:
// 1
// 5

ref assignment operator

Beginning with C# 7.3, you can use the ref assignment operator = ref to reassign a ref local or ref readonly local variable. The following example demonstrates the usage of the ref assignment operator:

void Display(double[] s) => Console.WriteLine(string.Join(" ", s));

double[] arr = { 0.0, 0.0, 0.0 };

ref double arrayElement = ref arr[0];
arrayElement = 3.0;

arrayElement = ref arr[arr.Length - 1];
arrayElement = 5.0;
// Output:
// 0 0 0
// 3 0 0
// 3 0 5

In the case of the ref assignment operator, both of its operands must be of the same type.

Compound assignment

For a binary operator op, a compound assignment expression of the form

x op= y

is equivalent to

x = x op y

except that x is only evaluated once.

Compound assignment is supported by arithmetic, Boolean logical, and bitwise logical and shift operators.

Null-coalescing assignment

Beginning with C# 8.0, you can use the null-coalescing assignment operator ??= to assign the value of its right-hand operand to its left-hand operand only if the left-hand operand evaluates to null. For more information, see the ?? and ??= operators article.

Operator overloadability

A user-defined type cannot overload the assignment operator. However, a user-defined type can define an implicit conversion to another type. That way, the value of a user-defined type can be assigned to a variable, a property, or an indexer element of another type. For more information, see User-defined conversion operators.

A user-defined type cannot explicitly overload a compound assignment operator. However, if a user-defined type overloads a binary operator op, the op= operator, if it exists, is also implicitly overloaded.

C# language specification

For more information, see the Assignment operators section of the C# language specification.

For more information about the ref assignment operator = ref, see the feature proposal note.

See also