【问题标题】:Object initializers in C# cause compile-time errorC# 中的对象初始化程序导致编译时错误
【发布时间】:2012-01-21 04:49:35
【问题描述】:

在编译一些 C# 代码时,我得到了错误:

新的表达式在类型后需要 () 或 []

我的代码如下:

request.AddExtension(new ClaimsRequest {
        Country = DemandLevel.Request,
        Email = DemandLevel.Request,
        Gender = DemandLevel.Require,
        PostalCode = DemandLevel.Require,
        TimeZone = DemandLevel.Require,
});

我正在使用 ASP.NET 2.0。

你能帮忙解释一下为什么会出现这个错误吗?

【问题讨论】:

  • 您使用的是 .NET 2.0,因此您无法执行对象初始化程序。旁注,如果您使用的是 .NET 3.5,如果正在构造的类具有无参数构造函数,则无需提供 () 即可。
  • @StealthRabbi 这不是真的。如果您使用 C# 3.0(即 Visual Studio 2008),则可以在 .NET 2.0 中使用对象初始化程序。
  • @StealthRabbi 小注;对象初始化器是一个编译器特性;当面向 .NET 2.0 时,您仍然可以使用 C# 3.0;但是,here 的问题是涉及到 ASP.NET 2.0(可能配置为纯 2.0 模式),并且可能正在使用 2.0 编译器执行动态编译。
  • 注意:如果您的服务器上有 .NET 3.5 或更高版本,您可能可以启用 3.0 编译器 - 请参阅:hanselman.com/blog/…
  • 好的,所以编译器功能可以编译到指定的目标 .NET 框架。这是否适用于 .NET 4,因为它不是基于 3.5,因为 3.5/3.0 是基于 2?谢谢。

标签: c# visual-studio-2005 asp.net-2.0 object-initializers


【解决方案1】:

您不能使用object initializers (new T { Property = value }),除非您正在为 C# 3.0 或更高版本编写代码。

不幸的是,对于 C# 3.0 之前的版本,您需要这样做:

ClaimsRequest cr = new ClaimsRequest();
cr.Country = DemandLevel.Request;
cr.Email = DemandLevel.Request;
cr.Gender = DemandLevel.Require;
cr.PostalCode = DemandLevel.Require;
cr.TimeZone = DemandLevel.Require;
request.AddExtension(cr);

A bit more about object initializers here.

判断您使用的 C# 版本的最简单方法是查看您使用的 Visual Studio 版本。 C# 3.0 与 Visual Studio 2008 捆绑在一起。

但是,您确实有“出路”。在 .NET 4.0 之前但在 .NET 2.0 之后,所有新的语言和框架功能实际上只是位于 CLR 2.0 版之上的托管库。这意味着如果您下载 C# 3.0+ 编译器(作为后续框架的一部分),您可以针对该编译器编译您的代码。 (这在 ASP.NET 环境中并非易事。)

【讨论】:

  • @user1099825:使用我提供的代码片段使这项工作适用于 C# 3.0 之前的版本。
  • @user1099825 VS2005现在落后很多版本;名称中有一个线索 - 现在是(给或几天)2012,软件移动快速....只是说'
【解决方案2】:

您是否可能从其他来源复制了该代码?您似乎正在尝试在 C# 2.0 中使用 C# 3.0(或更高版本)示例(带有“对象初始化程序”)。

在 C# 2.0 及以下您需要:

ClaimsRequest req = new ClaimsRequest();
req.Country = DemandLevel.Request;
req.Email = DemandLevel.Request;
req.Gender = DemandLevel.Require;
req.PostalCode = DemandLevel.Require;
req.TimeZone = DemandLevel.Require;
request.AddExtension(req);

【讨论】:

  • With Your code error is on First Line var req = new ClaimsRequest();
  • @user1099825 哦,应该是var 吧?更改为显式类型ClaimsRequest。习惯的力量!
【解决方案3】:

照他说的做

request.AddExtension(new ClaimsRequest() {

如果您有 new 关键字,则需要运行构造函数 ()

【讨论】:

  • 他正在使用 .NET 2.0。不能做obj。还没有初始化。
  • 使用对象初始化器时不需要。
  • 这不是真的。在 C# 3.0 之前,您不能使用对象初始值设定项。在 C# 3.0 之后,如果您使用初始化程序,括号是可选的。
  • 那无济于事; () 在 3.0 样式的对象初始化器中是可选的,并且仅在您想将参数传递给构造器除了初始化器必需
猜你喜欢
  • 2017-08-15
  • 1970-01-01
  • 2011-09-17
  • 2010-11-30
  • 2011-05-26
  • 1970-01-01
  • 1970-01-01
  • 2019-07-10
相关资源
最近更新 更多