2010-01-07 11 views
25

Ich erhalte einen seltsamen Fehler, wenn dies zu tun: (.net 2,0)Initialisierung Liste Inline

public overrides List<String> getSpaceballs 
{ 
    get { return new List<String>() { "abc","def","egh" }; } 
} 

VS bittet um ; nach (). Warum?

Ich kann sicher, dies zu tun:

public overrides string[] getSpaceballs 
{ 
    get { return new string[] { "abc","def","egh" }; } 
} 

Antwort

6

Die erste Option ist nicht legal :)

Sie nur diese Art von initialiser auf Arrays tun können.

- Bearbeiten: Siehe Andrew Hare's Post (und andere, unten); Es ist nur in Version 3 und höher verfügbar.

- Bearbeiten wieder:

Nur klar sein, wenn Ihr Compiler von 3 oder größer ist, können Sie 2.0 Ziel kann dies zur Arbeit zu kommen (weil es bis auf den Code kompiliert, die Andrew zeigt, unten). Aber wenn Ihr Compiler 2 ist, dann können Sie nicht.

+2

Sammlungsinitialisierer wurden in C# 3.0 hinzugefügt. –

+0

Können Sie zwischen Framework-Version und Compiler-Version unterscheiden, da er nach Framework-Version 2.0 fragt. –

+0

Yannick: Äh, was? Ich verstehe nicht, was du meinst. Ich denke, der Hinweis, Andrew's Beitrag zu überprüfen, ist ausreichend; und unabhängig davon machte das OP klar, dass er 2.0 verwendete. –

57

C# collection initialization syntax wird nur in Version 3 und höher unterstützt (da Sie .NET 2.0 erwähnt haben, gehe ich davon aus, dass Sie auch C# 2 verwenden). Es kann etwas verwirrend sein, da C# immer eine ähnliche Syntax für Array-Initialisierung unterstützt hat, aber es ist nicht wirklich das Gleiche.

Auflistungsinitialisierer sind ein Compiler Trick, der Sie eine Sammlung in einer Anweisung wie folgt erstellen und initialisieren können:

var list = new List<String> { "foo", "bar" }; 

jedoch diese Aussage durch den Compiler dazu übersetzt:

List<String> <>g__initLocal0 = new List<String>(); 
<>g__initLocal0.Add("foo"); 
<>g__initLocal0.Add("bar"); 
List<String> list = <>g__initLocal0; 

Wie Sie sehen können, ist diese Funktion ein bisschen Syntaxzucker, der ein Muster in einen einzelnen Ausdruck vereinfacht.

1

Welche Version von VS verwenden Sie? Das ist nur die legale Syntax in C# 3.0. Wenn Sie also VS2005 verwenden, erhalten Sie diesen Fehler.

+0

BFree: Nur FYI, es ist nicht die Version von VS, die zählt, es ist die Compiler-Version (und das OP sagt, es ist .net 2 in der Post). –

+1

@silky: Die Version von VS ist an den von Ihnen verwendeten Compiler gebunden. Ab VS2005 (C# 3.0) können Sie die obige Anweisung mit 2.0 als Zielframework kompilieren. –

+0

Yannick: Ja, das liegt nur an der * Compiler-Version *. Gründlich durchlesen. –

5

Wie die anderen Benutzer darauf hinweisen, wird das in 2.0 nicht unterstützt. Sie können es jedoch nachahmen, indem Sie Folgendes tun.

Bitte beachten Sie, dass dies einen gewissen Rechenaufwand verursacht.

Verwandte Themen