VS2017错误调试元组任务

VS2017 Error debugging Task of Tuple

我在使用元组任务时无法查看调试信息。例如。当断点命中时,我无法在悬停、本地 window 或手表 window.

中查看任何变量

重现只是新建一个WPF应用,添加System.ValueTuple,将这段代码添加到MainWindow.xaml.cs,然后在"return".[=12两行设置断点=]

using System.Threading.Tasks;
using System.Windows;

namespace WpfApp2
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private async void Button_Click(object sender, RoutedEventArgs e)
        {
            var task1 = TaskWithLocalDebugInfo();
            var task2 = TaskWithoutLocalDebugInfo();
        }

        private async Task<bool> TaskWithLocalDebugInfo()
        {
            var viewableInLocalWindowAndHover = true;
            return viewableInLocalWindowAndHover;
        }

        private async Task<(bool, bool)> TaskWithoutLocalDebugInfo()
        {
            var notViewableInLocalWindowAndHover = true;
            return (notViewableInLocalWindowAndHover, notViewableInLocalWindowAndHover);
        }
    }
}

编辑:如果我将不可见的局部变量添加到 watch,我得到:error CS8182: Predefined type 'ValueTuple`2' must be a struct.

看到watch window的错误后,我想起了C# 7中有一个新的ValueTask。所以我添加了package system.threading.tasks.extensions并将损坏的方法更改为使用ValueTask 而不是 Task

private static async ValueTask<(bool, bool)> TaskWithoutLocalDebugInfo()
{
    var notViewableInLocalWindowAndHover = true;
    return (notViewableInLocalWindowAndHover, notViewableInLocalWindowAndHover);
}

我现在可以看到调试信息了。

这是Visual Studio2017当前版本的一个bug,已经修复,下个季度发布。

看到 MS 员工的 GitHub issue and the comment 说它已修复。

同时,来自 GitHub 对 Apr 13, 2017 的评论:

i can confirm that the bug repros with ValueTuple 4.3.0, but not with 4.3.0-preview1-24530-04.

您可以通过 NuGet Package Manager/Manage NuGet Packages for Solution 界面安装 "preview" 版本。只需从 "Version:" 下拉列表中选择 select 4.3.0-preview1-24530-04,然后单击 "Install"。

希望在 Visual Studio 的下一次更新后,不再需要使用 "preview" 版本的软件包。正如前面提到的评论所指出的,不清楚为什么使用 "preview" 版本的包可以避免触发错误。但显然,如果可以的话,最好能够使用最新的 "stable" 版本的软件包;谁知道自 "preview" 版本以来发生了什么变化会导致一些 other 难以诊断的错误,在调试器或其他方面。