为什么 Visual Studio 调试器无法正确计算涉及泛型类型参数的表达式?



在以下代码中:

        private static void Main(string[] args)
        {            
            var listy = new List<DateTime> { DateTime.Now };
            MyMethod(listy);
        }
        static void MyMethod<T>(List<T> myList)
        {
            // put breakpoint here
        }

如果我在调试器中中断,在"myList"上打开QuickWatch,我看到:

myList
   [0]
   Raw View

如果我选择"[0]"节点并单击Add Watch,则添加到Watch的表达式:

(new System.Collections.Generic.Mscorlib_CollectionDebugView<System.DateTime>(myList)).Items[0]

这个表达式看起来是正确的,但是,观察窗口显示以下错误:

最佳重载方法匹配"System.Collections.Generic.Mscorlib_CollectionDebugView.Mscorlib_CollectionDebugView (System.Collections.Generic.ICollection)"有一些无效参数

这似乎是调试器中的一个错误。为什么会发生这种情况?有记录吗?

这看起来像是c#表达式求值器的重载解析逻辑中的一个错误。调用泛型类型构造函数和传递绑定泛型的组合似乎是一个关键。删除其中任何一个似乎都能解决问题。例如,您可以通过显式地将myList转换为ICollection<DateTime>来调用上述表达式(这并不能解决我尝试过的所有情况)

下面是我为缩小问题范围而编写的示例程序

class C<T> {
    public C(ICollection<T> collection) {
    }
}
static void Example<T>(ICollection<T> collection) {
}

在同一休息时间,您可以尝试以下计算

  • Example(myList) -工作无错误
  • new C<DateTime>(myList) -同样错误失败
在这一点上,我认为你应该在连接上提交一个错误。这绝对是一个bug(类似的代码在VB.Net中工作得很好)

看起来是这样的。我已经复制了这个错误。Mscorlib_CollectionDebugView<T>只有一个构造函数接受ICollection<T>, List<T>实现ICollection<T>。此外,显式转换到ICollection<T>也可以:

(new System.Collections.Generic.Mscorlib_CollectionDebugView<System.DateTime>((ICollection<DateTime>)myList)).Items[0]

最新更新