C# 为什么赢了';Visual Studio调试器是否正确计算包含泛型类型参数的表达式?
在以下代码中:C# 为什么赢了';Visual Studio调试器是否正确计算包含泛型类型参数的表达式?,c#,visual-studio,debugging,visual-studio-debugging,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)
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
}
如果选择“[0]”节点并单击“添加监视”,则添加到监视的表达式:
(新系统.Collections.Generic.Mscorlib\u CollectionDebugView(myList)).Items[0]
此表达式似乎正确,但“监视”窗口显示以下错误:
匹配的最佳重载方法
'System.Collections.Generic.Mscorlib_CollectionDebugView.Mscorlib_CollectionDebugView(System.Collections.Generic.ICollection)'
有一些无效的参数
这似乎是调试器中的一个bug。为什么会发生这种情况?它被记录在任何地方吗?看起来是这样的。我已经能够复制错误
Mscorlib_CollectionDebugView
只有一个构造函数接受ICollection
和List
实现ICollection
。此外,显式强制转换到ICollection
工作:
(new System.Collections.Generic.Mscorlib_CollectionDebugView<System.DateTime>((ICollection<DateTime>)myList)).Items[0]
(新系统.Collections.Generic.Mscorlib_CollectionDebugView((ICollection)myList))。项[0]
这看起来像是C#的表达式求值器的重载解析逻辑中的错误。调用泛型类型构造函数和传递绑定泛型的组合似乎是一个关键。删除其中一个似乎可以解决问题。例如,您可以通过显式地将myList
强制转换为ICollection
来调用前面提到的表达式(这并不能解决我尝试过的所有情况)
这是我为缩小问题范围而编写的一个示例程序
class C<T> {
public C(ICollection<T> collection) {
}
}
static void Example<T>(ICollection<T> collection) {
}
C类{
公共C(ICollection集合){
}
}
静态无效示例(ICollection集合){
}
同时,您可以尝试以下评估
-无误运行示例(myList)
-失败并出现相同错误新建C(myList)
在这一点上,我认为您应该在上提交一个bug。这肯定是一个bug(类似的代码在VB.Net中可以正常工作)它在myList中有问题,如果使用静态变量,它就会正常工作。发布到connect.microsoft.comMicrosoft,希望这不会发生在dev11中。谢谢。我也找到了这个解决方法。但我更关心的是为什么会发生这种情况,这样我就可以了解这种变通方法是否总是适用的(我正在编写一个与调试有关的Visual Studio扩展,因此了解根本原因对我来说很重要)谢谢!我开了一张联运票。我想我会一直使用变通方法,并希望达到最好。
class C<T> {
public C(ICollection<T> collection) {
}
}
static void Example<T>(ICollection<T> collection) {
}