【问题标题】:Ambiguous errors "; expected" "unexpected end of declaration"模棱两可的错误“;预期”“声明意外结束”
【发布时间】:2016-10-05 13:18:03
【问题描述】:

我的项目中有以下代码。出于此交换的目的,可以注释掉其中的其他代码。

namespace Project.HttpHandlers
{
    public class Web : IHttpHandler
    {
        /// <summary>
        /// Gets a value indicating whether another request can use the 
        /// <see cref="T:System.Web.IHttpHandler"/> instance.
        /// </summary>
        /// <returns>
        /// true if the <see cref="T:System.Web.IHttpHandler"/> instance 
        /// is reusable; otherwise, false.
        /// </returns>
        public bool IsReusable => false;
    }
}

Visual Studio 在“public bool IsReusable => false;”上抛出错误声明“;预期”的行。

在 => 运算符上突出显示智能感知错误时,我得到“声明意外结束”。

如果我将其更改为“public bool IsReusable = false;”错误消失了。我不完全知道这条线的功能以及为什么那里有一个 lambda 运算符,所以我不想这样做。我知道它可以在同事的机器上编译,而且我看到它在网络上的其他地方被引用。

我似乎缺少 Visual Studio 中的引用或其他内容,但我找不到它。

【问题讨论】:

  • 您确定您的 iis 实例支持 C#6 吗?我自己从未使用过它,但我认为您需要使用 asp.net core 才能获得这些功能。
  • @ScottChamberlain 不会是 VS 的版本,因为 C#6 是编译器。
  • 尝试在 VS 2013 中使用新语法时出现同样的错误,所以我猜你的编译器或 IDE 不支持 C# 6。
  • @juharr 这取决于 OP 是否正在将 dll 部署到 IIS 或正在部署 .cs 文件并让服务器对其进行编译。如果服务器正在编译它,那么你用来编写它的 VS 版本无关紧要。
  • @juharr - 根据使用的 ASP.Net 的“模型”,部分或全部代码在网站启动或请求特定页面之前不会编译。

标签: c# asp.net lambda httphandler ihttphandler


【解决方案1】:

您的同事似乎正在使用 Visual Studio 2015,而您正在使用 Visual Studio 2013 或更早版本来编译项目。

如果您不想升级 VS 版本,可以将 lambda 表达式替换为

public bool IsReusable { get { return false; } }

没有任何副作用。

【讨论】:

  • 这是真的。他使用的是 2015 社区版,我使用的是专业版 2013。谢谢。
【解决方案2】:

该行定义了一个始终返回 false 的属性。它在功能上等同于public bool IsReusable {get {return false;} }

在定义属性或方法时使用它称为expression-bodied member。由于它是 C# 6.0 的一项新功能,因此您必须确保您的目标是 6.0,否则它将无法编译。 VS2015 默认为 6.0,但要在 2013 年使用它,您必须 install it separately。你的同事要么已经这样做了,要么正在使用 VS2015。

【讨论】:

    【解决方案3】:

    这是 expression bodied members 的 c# 6 语法。

     private readonly bool _isReusable = false; 
     public bool IsReusable 
     {
         get {return _isReusable; } 
     }
    

    编辑:根据 Scott Chamberlain 的评论更正。

    【讨论】:

    • 我没有说这不合法。但它没有建立。所以在构建过程中没有使用 C# 6,这将解决它。
    • 那么公共bool IsReusable = false; 的行为与public bool IsReusable =&gt; false; 不同,你需要做private readonly bool _isReusable = false; public bool IsReusable {get {return _isReusable; } }
    猜你喜欢
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-10
    相关资源
    最近更新 更多