提交 b168a821 编写于 作者: A AlekseyTs

C#: Disallow field-like event initializers in structs. Fixes #343.

***NO_CI***
 (changeset 1387165)
上级 1578cdf9
......@@ -2648,28 +2648,13 @@ private static void CheckInterfaceMember(Symbol member, DiagnosticBag diagnostic
private void CheckForStructBadInitializers(MembersAndInitializersBuilder builder, DiagnosticBag diagnostics)
{
Debug.Assert(TypeKind == TypeKind.Struct);
if (builder.InstanceInitializers.Count > 0)
{
var members = builder.NonTypeNonIndexerMembers;
foreach (var s in members)
foreach (var initializers in builder.InstanceInitializers)
{
foreach (FieldOrPropertyInitializer initializer in initializers)
{
var p = s as SourcePropertySymbol;
if (p != null && !p.IsStatic && p.IsAutoProperty
&& p.BackingField.HasInitializer)
{
// '{0}': cannot have instance field initializers in structs
diagnostics.Add(ErrorCode.ERR_FieldInitializerInStruct, p.Locations[0], this);
}
else
{
var f = s as SourceMemberFieldSymbol;
if (f != null && !f.IsStatic && f.HasInitializer)
{
// '{0}': cannot have instance field initializers in structs
diagnostics.Add(ErrorCode.ERR_FieldInitializerInStruct, f.Locations[0], this);
}
}
// '{0}': cannot have instance field initializers in structs
diagnostics.Add(ErrorCode.ERR_FieldInitializerInStruct, (initializer.Field.AssociatedSymbol ?? initializer.Field).Locations[0], this);
}
}
}
......
......@@ -38,6 +38,52 @@ public struct A
);
}
[WorkItem(1075325, "DevDiv"), WorkItem(343, "CodePlex")]
[Fact()]
public void TestInitEventStruct()
{
var text = @"
struct S {
event System.Action E = null;
void M()
{
E();
}
}
";
CreateCompilationWithMscorlib(text).VerifyDiagnostics(
// (3,25): error CS0573: 'S': cannot have instance property or field initializers in structs
// event System.Action E = null;
Diagnostic(ErrorCode.ERR_FieldInitializerInStruct, "E").WithArguments("S").WithLocation(3, 25)
);
}
[WorkItem(1075325, "DevDiv"), WorkItem(343, "CodePlex")]
[Fact()]
public void TestStaticInitInStruct()
{
var text = @"
struct S {
static event System.Action E = M;
static int F = 10;
static int P {get; set;} = 20;
static void M()
{
}
static void Main()
{
System.Console.WriteLine(""{0} {1} {2}"", S.F, S.P, S.E == null);
}
}
";
var comp = CreateCompilationWithMscorlib(text, options: TestOptions.DebugExe);
CompileAndVerify(comp, expectedOutput: "10 20 False").VerifyDiagnostics();
}
// Test constructor forwarding works for structs
[WorkItem(540896, "DevDiv")]
[Fact]
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册