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

Console.WriteLine(numbers.Capacity);
numbers.Capacity = 100;
Console.WriteLine(numbers.Capacity);
// Output:
// 4
// 100

int newFirstElement;
double originalFirstElement = numbers[0];
newFirstElement = 5;
numbers[0] = newFirstElement;
Console.WriteLine(originalFirstElement);
Console.WriteLine(numbers[0]);
// Output:
// 1
// 5

The left-hand operand of an assignment receives the value of the right-hand operand. When the operands are of value types, assignment copies the contents of the right-hand operand. When the operands are of reference types, assignment copies the reference to the object.

This is called value assignment: the value is assigned.

ref assignment

Ref assignment = ref makes its left-hand operand an alias to the right-hand operand. The left-hand operand must be a ref local, ref readonly local, or a ref field in a ref struct. Both operands must be of the same type.

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 };
Display(arr);

ref double arrayElement = ref arr[0];
arrayElement = 3.0;
Display(arr);

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

In the preceding example, the ref local arrayElement variable is initialized as an alias to the first array element. Then, it's reassigned to become an alias to the last array element. As it's an alias, when you update its value with an ordinary assignment operator =, the corresponding array element is also updated.

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

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 can't 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 can't 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