Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果声明是接口,则编译器无法识别泛型中的属性_C#_Visual Studio - Fatal编程技术网

C# 如果声明是接口,则编译器无法识别泛型中的属性

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

请看以下内容,其中演示了我在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);
    }
}
有没有办法让它发挥作用

编辑:

查看本地窗口并将鼠标悬停在
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);
}