在C# 3.0中初始化字典

3
我遇到了以下集合初始化的问题:
private Dictionary<string, string> mydictionary = new Dictionary<string, string>()
{
    {"key", "value"}
    , {"key2", "value2"}
    , {"key3", "value3"}
};

我一直遇到各种编译器关于语法的错误。从我搜索的结果来看,这应该是完全有效的C# 3.0代码。

第一个出现的错误是:

Error   102 ; expecte

我做错了什么?

更新

它一直告诉我期望在右括号 ) 后面加上分号 ;

我试图在静态类中创建这个内容。如果我将其删除,那么一切都可以正常编译。


4
你可能漏掉了前一行的分号。也许你应该发布更多的代码。 - Gabe
5个回答

4
我的结论是:你的目标框架是2.0,否则不可能出现那个错误。
你确定你使用的是3.0框架吗?
编辑:
1- 在项目(解决方案资源管理器)上,右键单击ProjectName并转到属性。
2- 在应用程序选项卡上检查“目标框架”项目。
如果说2.0,请将其更改为3.0,并对解决方案中的所有项目执行相同操作。

这很奇怪,我正在将这个应用程序从2.0转换为3.5,但是后来意识到我要部署到的服务器只支持3.0。所以我回到了3.0。如果我构建解决方案,就没有问题。如果我构建项目,就会出现错误。如果我紧接着重新构建项目,它也会成功。我使用的是VS2008专业版。 - Casey
1
只有一个解决方案和一个项目。我回到3.5,清理并重新构建了所有内容,然后回到3.0并做了同样的事情,问题似乎已经消失了。 - Casey
哇,矩阵里出现了奇怪的故障。 :-) - Pretzel

1
你是把它做成属性/字段吗?你标记为私有了吗?
Dictionary<string, string> temp = new Dictionary<string, string>()
    {
        { "key", "value" },
        { "key1", "value" },
        { "key2", "value2" }
    };

这是一个名为temp的本地变量字典

private Dictionary<string, string> _fieldDictionary = new Dictionary<string, string>()
        {
            { "key", "value" },
            { "key1", "value" },
            { "key2", "value2" }
        };

这是一个本地成员。

两个都编译了,你还有更多的代码没有放上来吗?

我建议你新建一个类,逐步加入字段、属性等,直到找出错误。你上传的代码在我使用VS 2008时是完全合法的。如果你慢慢重新创建类,可能会显示出错误所在。


1
+1 错误的语法可能在文件的其他地方。 - Bryan Watts

0

如果你只是声明字典,然后添加键/值对呢?

  Dictionary<string, string> temp = new Dictionary<string, string>();
    temp.Add("key", "value");
    temp.Add("key1", "value1");
    temp.Add("key2", "value2");

1
-1 OP 特别询问了关于 C# 3.0 集合初始化器语法的内容。 - Bryan Watts
2
我的建议只是一个“如果”你这样做会怎样的想法。无论如何,这个问题已经被问过了。https://dev59.com/OXRB5IYBdhLWcg3w1Kr0 - Robert Williams
说真的,仅仅因为有人超出了问题的范围,这并不意味着它是一个糟糕的回答。事实上,有时候帮助指导新手是必要的。在我看来,这是一个非常好的建议。 - Pretzel
@Pretzel 这个回答就像是OP在问他们的本田引擎出了问题,而@Robert Williams回答“买美国货!”美国车可能是一个可行的选择,但在那个问题的背景下,它们是无关紧要的。 - Bryan Watts
@Pretzel:这个比喻也可以用来形容烤面包机。用其他汽车比喻回应汽车比喻已经很陈旧了,但我会让你继续下去。 - Bryan Watts
显示剩余3条评论

0

我认为你需要去掉 () (由David Basarab纠正。感谢David!)

这个页面展示了一些很好的例子: http://www.codeguru.com/csharp/csharp/cs_misc/designtechniques/article.php/c11987

编辑

好的,我终于启动了VS2008并尝试了一下。

我将原帖中的代码直接粘贴到一个WinForms项目里面,在主要的 "public Form1()" 方法中,并点击构建按钮,结果它无法编译。

删除 "private" 关键字,就可以正常编译。

(我尝试使用public,internal等关键字,但都无法编译...)


()是可选的,您可以选择包含它们或不包含它们。 - David Basarab
嗯...好的,我知道了。我会删除我的建议,但我仍然认为给他提供文章链接是一个不错的开始。 - Pretzel
我无法在C# 3中测试它,但我在C# 4中测试过了。我认为在C# 3中不需要()。在C# 4中,它可以正确地使用带或不带()的方式。 - bloparod

0

请检查上面是否有任何潜在的错误;我将你的代码复制到了Visual Studio中的一个新项目中,它没有出现任何错误。您将此字典定义为哪个部分的一部分?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接