Open
Description
Readonly setter calls on non-variables
- Specification: proposals/readonly-setter-calls-on-non-variables.md
- Discussion: Remove CS 1612 for readonly structs #2068
Summary
Permits a readonly setter to be called on all non-variable expressions:
var c = new C();
// Remove the current CS1612 error, because ArraySegment<T>.this is readonly:
c.ArraySegmentProp[10] = new object();
// Invocation expressions already omit the CS1612 error when the setter is readonly:
c.ArraySegmentMethod()[10] = new object();
// In limited cases, ref-returning indexers can be used to work around this:
c.RefReturningIndexerWorkaround[10] = new object();
class C
{
public ArraySegment<object> ArraySegmentProp { get; set; }
public ArraySegment<object> ArraySegmentMethod() => ArraySegmentProp;
public Span<object> RefReturningIndexerWorkaround => ArraySegmentProp.AsSpan();
}
Currently, the code above gives the error CS1612 "Cannot modify the return value of 'C.ArraySegmentProp' because it is not a variable." This restriction is unnecessary when the setter is readonly. The restriction is there to remind you to assign the modified struct value back to the property. But there is no supported modification to the struct value when the setter is readonly, so there is no reason to assign back to the property.
// Requested by the current CS1612 error:
var temp = c.ArraySegmentProp;
temp[10] = new object();
c.ArraySegmentProp = temp; // But this line is purposeless; 'temp' cannot have changed.