DateTime.TryParseExact(..... out var date) 无法正常构建,但是 (... out date) 构建良好

DateTime.TryParseExact(..... out var date) fails to build without errors, but (... out date) builds fine

在一个 ASP.NET MVC 项目中,我的目标是 .Net 4.7,并且在尝试使用 C#7 中的新功能时,我遇到了一个奇怪的构建失败。

我有以下方法:

public class DateIsValid: ValidationAttribute
{
    public override bool IsValid(object value)
    {
        DateTime date;
        if (DateTime.TryParseExact(Convert.ToString(value), "d MMM yyyy", CultureInfo.CurrentCulture, System.Globalization.DateTimeStyles.None, out date))
            return date > DateTime.Now;
        else
            return false;
    }
}

这构建并运行良好,没有任何警告或错误。

但是,如果我尝试使用 C#7 中添加的 "out var xxx",它无法构建,但不会抛出任何异常或显示任何错误或警告:

public class DateIsValid: ValidationAttribute
{
    public override bool IsValid(object value)
    {
        if (DateTime.TryParseExact(Convert.ToString(value), "d MMM yyyy", CultureInfo.CurrentCulture, System.Globalization.DateTimeStyles.None, out var date))
            return date > DateTime.Now;
        else
            return false;
    }
}

认为这只是 VS 2017 中的错误,我尝试重新启动,但这没有帮助。是我写的有问题,还是应该提交给VS团队的bug?

在同一个项目中,我在 ConcurrentQueue.TryDequeue(out var item) 上遇到了同样的静默失败,但使用旧模式工作正常:

    int res;
    if (x.TryDequeue(out res))
    {
        res++;
    }

问题出在编译器上。该项目是作为 ASP.NET MVC 项目创建的,目标是 .Net 4.5.2(不是 4.6.2,上面的拼写错误),当我将目标框架更改为 4.7 并尝试使用 C#7 功能时,事情就发生了出错。我在多台开发机器上遇到了这个问题,我尝试了一些方法,但唯一有效的修复也是最简单和最快的:重新安装编译器: 在包管理器控制台中,运行 Install-Package Microsoft.Net.Compilers。有人建议我 post 解决方案作为答案,所以就这样吧。特别感谢@jonskeet 和@PanagiotisKanavos 找出问题(在上面的评论中)。

有趣的是,仅更改高级构建设置中的编译器版本并没有帮助。我还在同一台机器上毫无问题地将 WPF 项目迁移到 C#7,所以奇怪的是 ASP.NET 突然出现了这个问题,但编译器重新安装简单而轻松。