看看以下演示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>(T foo) where T : IFoo
{
//set breakpoint here and try to look at foo.Key
Console.WriteLine(foo.Key);
}
}
Run Code Online (Sandbox Code Playgroud)
当我在PrintFoo方法中创建断点并想要查看Visual Studio 的Key属性时,foo不会为我提供工具提示.通过添加foo.Key到监视窗口我收到以下错误:
错误CS1061:'T'不包含'Key'的定义,也没有扩展方法'Key'接受类型'T'的第一个参数(你是否缺少using指令或汇编引用?)
当我更改泛型声明Foo而不是IFoo编译器时可以访问'Key'属性,所以这个:
private static void PrintFoo<T>(T foo) where T : Foo
{
//set breakpoint here and try to look at foo.Key
Console.WriteLine(foo.Key);
}
Run Code Online (Sandbox Code Playgroud)
有没有办法让它发挥作用?
编辑:
两者,查看本地窗口和鼠标foo以获取工具提示,然后扩展属性工作.
添加foo.Key到监视窗口或写入?foo.Key到即时窗口带来的提到的错误,你不会得到一个提示,当你鼠标Key的foo.Key
使用Visual Studio 2015,2017测试.
这个问题有两种解决方法.使用工具>选项>调试>常规.您可以勾选"使用托管兼容模式"或"使用旧版C#和VB.NET表达式评估程序".
"使用托管兼容模式"是不必要的神秘,它实际上做的是用VS2010上次使用的调试引擎替换新的调试引擎.好的.它实际上也为您提供了遗留表达式评估程序.我建议你使用这个,因为它还避免了新调试引擎中的一堆其他错误.哪个在VS2015中特别错误.
我发现将其关闭的原因很少.您错过了最近添加的调试器功能,我只知道方法返回值检查,编辑+继续64位代码以及在非Windows系统上.NETCore中使用的新的可移植PDB格式.它必须用于调试C++/CLI代码.我不知道新的表达式评估器有什么好处,从来没有注意到任何东西.没有它们很容易生活,至少对我而言.
我对调试器团队的内部人员的了解不足以真正告诉我们发生了什么.但它看起来并不那么好,VS2017增加了一些新的令人讨厌的故障模式,新的调试引擎在最糟糕的时候坍塌成一堆废墟.从他们的面值看这些选项,他们肯定存在,因为他们知道最新的版本不符合要求.
更新:正如兰德所指出的,这一特殊缺陷似乎已经得到解决.我在版本15.9.3中看到了正确的行为.
Bug 在 Visual Studio 2019 中得到修复: https://developercommunity.visualstudio.com/content/problem/216341/compiler-doesnt-recognise-property-in-generic-if-d.html
Ivan Basov [MSFT] 评论:
看来这个问题在当前的 Visual Studio 中无法重现。我用 VS 2019 Preview 2 尝试过。该场景运行良好。感谢您的反馈意见!
还尝试在我的预览版本 1.1 上重现它,并且它也在那里得到修复。
也尝试了最新版本的 Visual Studio 2017 (15.9.5),并报告它也已修复。
| 归档时间: |
|
| 查看次数: |
198 次 |
| 最近记录: |