为什么Visual Studio调试器不能正确评估涉及泛型类型参数的表达式?

时间:2011-08-17 18:35:53

标签: c# visual-studio debugging visual-studio-debugging

在以下代码中:

        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)'   有一些无效的论点

这似乎是调试器中的一个错误。为什么会这样?它是否记录在任何地方?

2 个答案:

答案 0 :(得分:1)

这看起来像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) - 失败并出现同样的错误

此时我认为你应该在Connect上提交一个错误。这肯定是一个bug(类似的代码在VB.Net中运行良好)

答案 1 :(得分:0)

看起来那样。我已经能够复制错误了。 Mscorlib_CollectionDebugView<T>只有一个构造函数接受ICollection<T>List<T>实现ICollection<T>。此外,显式转换为ICollection<T>有效:

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