`RequiresVariableReceiver` should likely check for "not a reference type" instead of checking for "is a value type"
- Dominant language
- C#
- Stars
- 20.7k
- Forks
- 4.3k
- PR merge metrics
- PR metrics pending
Description
This is likely a bug, but needs confirmation on spec side: https://github.com/dotnet/csharpstandard/issues/1078
```
[Fact, WorkItem("")]
public void CS0131ERR_AssgLvalueExpected03_UnconstrainedTypeParameter()
{
var source = """
struct S
{
public object P { get; set; }
public object this[object index] { get { return null; } set { } }
}
interface I
{
object P { get; set; }
object this[object index] { get; set; }
}
class C
{
static void M() where T : I
{
default(T).P = null; // missing diagnostic
default(T)[0] = null; // missing diagnostic
}
}
""";
CreateCompilation(source).VerifyDiagnostics();
}
```
Relevant logic:
```
///
/// SPEC: When a property or indexer declared in a struct-type is the target of an
/// SPEC: assignment, the instance expression associated with the property or indexer
/// SPEC: access must be classified as a variable. If the instance expression is
/// SPEC: classified as a value, a compile-time error occurs. Because of 7.6.4,
/// SPEC: the same rule also applies to fields.
///
///
/// NOTE: The spec fails to impose the restriction that the event receiver must be classified
/// as a variable (unlike for properties - 7.17.1). This seems like a bug, but we have
/// production code that won't build with the restriction in place (see DevDiv #15674).
///
private static bool RequiresVariableReceiver(BoundExpression receiver, Symbol symbol)
{
return symbol.RequiresInstanceReceiver()
&& symbol.Kind != SymbolKind.Event
&& receiver?.Type?.IsValueType == true;
}
```
FYI @AlekseyTs
Contributor guide
Assessment
This issue has not been assessed yet.