【问题标题】:Compiler doesnt recognise property in generic if declaration is an interface如果声明是接口,编译器无法识别泛型中的属性
【发布时间】:2018-09-05 03:29:16
【问题描述】:

查看以下说明我的 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);
    }
}

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

错误 CS1061:“T”不包含“Key”的定义,并且没有 接受“T”类型的第一个参数的扩展方法“Key”可以是 找到(您是否缺少 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);
}

有没有办法让它工作?

编辑:

两者,查看本地窗口并将鼠标悬停在 foo 上以获取工具提示,而不是扩展属性。

foo.Key 添加到监视窗口或将?foo.Key 写入即时窗口会带来上述错误,并且当您将鼠标悬停在Keyfoo.Key 上时,您不会得到工具提示

使用 Visual Studio 2015、2017 测试。

【问题讨论】:

  • 你可以在观察窗口内castFoo。应该有帮助。
  • 也许不要依赖隐含的T 定义,尝试使用:PrintFoo&lt;Foo&gt;(new Foo() { Key = "Hello World" });
  • 那说它看起来像 VS 中的一个错误。最好的做法是report it to Microsoft
  • 我要问一个愚蠢的问题:与private static void PrintFoo(IFoo foo)相比,使用private static void PrintFoo&lt;T&gt;(T foo) where T : IFoo有什么优势?
  • @Richardissimo 在这种情况下没有,但此代码仅用于演示问题。

标签: c# visual-studio


【解决方案1】:

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

“使用托管兼容模式”是不必要的神秘,它实际上是用 VS2010 中最后使用的调试引擎替换新的调试引擎。好的一个。它实际上还为您提供了旧的表达式评估器。我建议您使用这个,因为它还避免了新调试引擎中的许多其他错误。这在 VS2015 中特别容易出错。

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

我对调试器团队内部的了解不够深入,无法真正了解发生了什么。但是看起来不太好,VS2017 增加了一些新的令人讨厌的故障模式,新的调试引擎在最糟糕的时候崩溃成一堆瓦砾。从表面上看这些选项,它们肯定存在,因为他们知道最新版本不符合标准。


更新:正如 Rand 所指出的,这个特定的缺陷似乎已经得到解决。我在 15.9.3 版中看到了正确的行为。

【讨论】:

  • 评论更新您,以防您错过。认为您可能有兴趣知道它已得到修复,也许是时候给新的调试器另一个机会了。 :)
【解决方案2】:

在 Visual Studio 2019 中修复了错误: https://developercommunity.visualstudio.com/content/problem/216341/compiler-doesnt-recognise-property-in-generic-if-d.html

Ivan Basov [MSFT] 的评论:

在当前的 Visual 中似乎无法重现该问题 工作室。我使用 VS 2019 Preview 2 进行了尝试。该场景运行良好。 感谢您的反馈!

还尝试在我的预览版 1.1 上重现它,并且它也已修复。

也尝试了最新版本的 Visual Studio 2017 (15.9.5),并且可以报告它也已修复。

【讨论】:

    猜你喜欢
    • 2011-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    • 2020-08-02
    相关资源
    最近更新 更多