Visual Studio调试模式中的struct和class显示值

Wil*_*Ray 5 c# visual-studio

考虑以下简单程序(使用Visual Studio 2015):

public class Program
{
    public static void Main(string[] args)
    {
        var dtClass = new MyDateTimeWrapperClass(DateTime.Today);
        var dtStruct = new MyDateTimeWrapperStruct(DateTime.Today);
        WriteLine(dtClass);
        WriteLine(dtStruct);
        ReadKey();
    }
}

public class MyDateTimeWrapperClass
{
    private readonly DateTime _value;

    public MyDateTimeWrapperClass(DateTime value)
    {
        _value = value;
    }

    public override string ToString() => _value.ToString("MM/dd/yyyy");
}

public struct MyDateTimeWrapperStruct
{
    private readonly DateTime _value;

    public MyDateTimeWrapperStruct(DateTime value)
    {
        _value = value;
    }

    public override string ToString() => _value.ToString("MM/dd/yyyy");
}
Run Code Online (Sandbox Code Playgroud)

控制台将报告方法的预期输出ToString.但是,在调试模式下,输出不一样.

在此输入图像描述

我一直以为Visual Studio使用ToString()调用来显示这个值.但结构似乎并非如此.有人可以解释这种行为吗?我会很感激答案,这些答案也描述了这个值是如何计算的,因为看起来我的理解是不完整的.

更新:附加信息

  1. 使用Visual Studio 2013时不会发生此问题.
  2. ToString调用硬编码到不同的值会导致正常行为.

Chr*_*ris 3

不确定为什么 - 但 DebuggerDisplayAttribute 可以用于这种效果:

https://msdn.microsoft.com/en-us/library/ms228992(v=vs.110).aspx < 使用指南 https://msdn.microsoft.com/en-us/library/x810d419.aspx <显示可应用的类型

像这样的事情会起作用:

[DebuggerDisplay("{ToString()}")]
public struct MyDateTimeWrapperStruct
{
    private readonly DateTime _value;

    public MyDateTimeWrapperStruct(DateTime value)
    {
        _value = value;
    }

    public override string ToString() => _value.ToString("MM/dd/yyyy");
}
Run Code Online (Sandbox Code Playgroud)

使用以下命令删除引号:

[DebuggerDisplay("{ToString(),nq}")]
Run Code Online (Sandbox Code Playgroud)