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

Ran*_*dom 10 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() { 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到即时窗口带来的提到的错误,你不会得到一个提示,当你鼠标Keyfoo.Key

使用Visual Studio 2015,2017测试.

观看VS窗口时出错

Han*_*ant 5

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

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

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

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


更新:正如兰德所指出的,这一特殊缺陷似乎已经得到解决.我在版本15.9.3中看到了正确的行为.


Ran*_*dom 1

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),并报告它也已修复。