C# 如果声明是接口,则编译器无法识别泛型中的属性
请看以下内容,其中演示了我在Visual Studio 2017编译器方面的问题C# 如果声明是接口,则编译器无法识别泛型中的属性,c#,visual-studio,C#,Visual Studio,请看以下内容,其中演示了我在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() { K
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);
}
}
有没有办法让它发挥作用
编辑:
查看本地窗口并将鼠标悬停在foo
上以获取工具提示,然后展开属性即可
将foo.Key
添加到“监视”窗口或将?foo.Key
写入即时窗口会出现上述错误,并且当您将鼠标悬停在foo.Key
的Key
上时,将不会看到工具提示
使用Visual Studio 2015、2017进行测试
此问题有两种解决方法。使用工具>选项>调试>常规。您可以勾选“使用托管兼容模式”或“使用旧的C#和VB.NET表达式计算器” “使用托管兼容性模式”是不必要的神秘,它实际上是用VS2010中最后使用的调试引擎替换新的调试引擎。好的。实际上,它还提供了遗留表达式计算器。我建议您使用这个,因为它还避免了新调试引擎中的一系列其他错误。在2015年的VS中,这辆车特别多 我几乎找不到理由把它关掉。您错过了最近添加的调试器功能,我只知道方法返回值检查、64位代码的编辑+继续以及非Windows系统上.NETCore中使用的新的可移植PDB格式。它必须用于调试C++/CLI代码。我不知道新的表达式计算器有什么更好的地方,从来没有注意到任何东西。至少对我来说,没有它们很容易生活 我不太了解调试器团队的内部情况,无法真正说出发生了什么。但它看起来不太好,VS2017添加了一些新的严重故障模式,新的调试引擎在最坏的情况下倒塌成一堆瓦砾。从表面上看,这些选项肯定存在,因为他们知道最新版本不符合标准
更新:正如兰德公司指出的,这一特定缺陷似乎已经得到解决。我在版本15.9.3中看到了正确的行为。在Visual Studio 2019中修复了错误: 伊万·巴索夫的评论[MSFT]: 在当前的视觉环境中,该问题似乎无法再现 演播室我用VS2019预览版2试过了。这个场景运行良好。 感谢您的反馈 我也尝试在我的预览版1.1上复制它,它也被修复了
还尝试了Visual Studio 2017(15.9.5)的最新版本,并可以报告它在那里得到了修复。您可以在watch window内切换到
Foo
。应该有帮助。也许不要依赖隐式的t
定义,尝试使用:PrintFoo(newfoo(){Key=“Hello World”})
说这看起来像是VS中的一个bug。最好的做法是这样。我要问一个愚蠢的问题:做私有静态无效打印foo(T foo)有什么好处,其中T:IFoo
与私有静态无效打印foo(IFoo foo)
相比?@richardisimo在这种情况下没有优势,但这段代码只是为了演示问题。请发表评论以更新您,以防您错过它。虽然您可能对知道它已被修复感兴趣,但也许是时候再给新的调试器一次机会了。:)
private static void PrintFoo<T>(T foo) where T : Foo
{
//set breakpoint here and try to look at foo.Key
Console.WriteLine(foo.Key);
}