如果声明是接口,则编译器不会识别generics中的属性

看看以下演示Visual Studio 2017编译器的问题

public interface IFoo { string Key { get; set; } } public class Foo : IFoo { public string Key { get; set; } } class Program { static void Main(string[] args) { PrintFoo(new Foo() { Key = "Hello World" }); Console.ReadLine(); } private static void PrintFoo(T foo) where T : IFoo { //set breakpoint here and try to look at foo.Key Console.WriteLine(foo.Key); } } 

当我在PrintFoo方法中创建断点并想要查看fooKey属性时,Visual Studio不会为我提供工具提示。 通过将foo.Key添加到监视窗口,我收到以下错误:

错误CS1061:’T’不包含’Key’的定义,也没有扩展方法’Key’接受类型’T’的第一个参数(你是否缺少using指令或汇编引用?)

当我将generics声明更改为Foo而不是IFoo ,编译器可以访问“Key”属性,因此:

 private static void PrintFoo(T foo) where T : Foo { //set breakpoint here and try to look at foo.Key Console.WriteLine(foo.Key); } 

有没有办法让它发挥作用?

编辑:

两者都看着本地窗口和鼠标在foo上获取工具提示而不是扩展属性。

foo.Key添加到监视窗口或将?foo.Key写入即时窗口会带来上述错误,当您将鼠标移到foo.Key Key上时,您将无法获得工具提示

使用Visual Studio 2015,2017测试。

观看VS窗口时出错

这个问题有两种解决方法。 使用工具>选项>调试>常规。 您可以勾选“使用托管兼容模式”或“使用旧版C#和VB.NET表达式评估程序”。

“使用托管兼容模式”是不必要的神秘,它实际上做的是用VS2010上次使用的调试引擎替换新的调试引擎。 好的。 它实际上也为您提供了遗留表达式评估程序。 我建议你使用这个,因为它还避免了新调试引擎中的一堆其他错误。 哪个在VS2015中特别错误。

我发现将其关闭的原因很少。 您错过了最近添加的调试器function,我只知道方法返回值检查,编辑+继续64位代码以及在非Windows系统上.NETCore中使用的新的可移植PDB格式。 它必须用于调试C ++ / CLI代码。 我不知道新的表达式评估器有什么好处,从来没有注意到任何东西。 没有它们很容易生活,至少对我而言。

我对调试器团队的内部人员的了解并不足以告诉他们发生了什么。 但它看起来并不那么好,VS2017增加了一些新的令人讨厌的故障模式,新的调试引擎在最糟糕的时候坍塌成一堆废墟。 从他们的面值看这些选项,他们肯定存在,因为他们知道最新版本不符合要求。