-
Notifications
You must be signed in to change notification settings - Fork 4.2k
Open
Labels
Milestone
Description
This is likely a bug, but needs confirmation on spec side: dotnet/csharpstandard#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<T>() where T : I
{
default(T).P = null; // missing diagnostic
default(T)[0] = null; // missing diagnostic
}
}
""";
CreateCompilation(source).VerifyDiagnostics();
}
Relevant logic:
/// <summary>
/// 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.
/// </summary>
/// <remarks>
/// 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).
/// </remarks>
private static bool RequiresVariableReceiver(BoundExpression receiver, Symbol symbol)
{
return symbol.RequiresInstanceReceiver()
&& symbol.Kind != SymbolKind.Event
&& receiver?.Type?.IsValueType == true;
}
FYI @AlekseyTs