【问题标题】:Can Extension Methods Be Called From The Immediate Window可以从即时窗口调用扩展方法吗
【发布时间】:2012-01-13 12:03:12
【问题描述】:

我问这个问题是因为每当我尝试从 Visual Studio 2010 的即时窗口调用扩展方法时,都会收到以下错误:

System.Collections.Generic.IEnumerable' 不包含 'ToList' 的定义,并且找不到接受类型为 'System.Collections.Generic.IEnumerable' 的第一个参数的扩展方法 'ToList'(您是否缺少使用指令还是程序集引用?)

如果即时窗口不支持扩展方法,那么为什么当我键入我的变量(IEnumerable<QueryFilter> 类型)后跟一个点时,IntelliSense 会列出所有扩展方法?

我在命令窗口中输入的内容没有任何问题,因为如果我将其复制并粘贴到我的代码文件中并运行,它就可以工作。

使用 Visual Studio 2012 为相同的解决方案做同样的事情可以正常工作。如果我切换回 VS2010 并且问题仍然存在。

【问题讨论】:

    标签: c# linq visual-studio code-contracts


    【解决方案1】:

    扩展方法是语法糖。实际上它们是用this 关键字实现的static。 您可以使用提供扩展方法的静态方法调用任何扩展方法。然后您应该将正在扩展的对象作为第一个参数传递。

    【讨论】:

    • 如果我无法使用该语法调用扩展方法,为什么 IntelliSense 会列出它们?这是 Visual Studio 中的错误吗?
    • 投了反对票,因为它没有回答为什么不能在即时窗口中使用正常的流利表示法调用扩展方法的问题。
    • @bradgonesurfing 感谢您的解释。然而,主要问题是“可以”而不是“为什么”。答案是否定的,我也提供了一个解决方法。不幸的是,我无法回答次要的为什么问题。
    • 虽然这是真的,而且我一直在直接从 Enumerable 调用方法,但这非常笨拙。调用多个 linq 扩展方法最终会在即时窗口中变得异常冗长和大量类型。这有点令人沮丧。
    【解决方案2】:

    扩展方法只是静态方法。

    您应该能够使用例如System.Linq.Enumerable.ToList()

    【讨论】:

    • 投了反对票,因为它没有回答为什么不能在即时窗口中使用正常的流利表示法调用扩展方法的问题。
    【解决方案3】:

    这是因为 System.Linq 命名空间未导入到您在调试时所处的当前上下文中。

    添加

    using System.Linq;
    

    在您的代码中。

    Visual Studio 2010 示例

    第一次导入System.LINQ,然后不导入using System.LINQ

    编辑: 如果命名空间被导入并且 IntelliSense 正在显示方法,那么它可能是即时窗口的错误。 见this bug entry on connect

    【讨论】:

    • @Aphelion 你错了,即时窗口确实支持扩展方法(刚刚测试VS2010)。至少在投票之前测试它-__-
    • @Ɖiamond ǤeezeƦ => 您使用的 Visual Studio/C# 版本是什么?
    • @ken2k Visual Studio 2010。此外,我正在调试的文件顶部有using System.Linq
    【解决方案4】:

    扩展方法转换为“Enumerable.ToList”编译器通常会转换

    myList.Tolist();
    

    收件人:

    Enumerable.ToList(myList);
    

    在编译期间。如果您愿意,我相信您可以使用快速监视窗口中的扩展方法。

    【讨论】:

      【解决方案5】:

      此行为是由Code Contracts 引起的,不仅限于立即窗口,还包括条件断点窗口。

      2016 年 3 月 1 日更新: 发现这个MSDN Question 询问为什么类型解析在我的监视窗口中不起作用。所描述的行为与我使用即时窗口时的体验完全相同。原因也归因于 CodeContracts,并且已在 Microsoft Connect 上提交了错误报告。未说明该错误是否已解决。

      【讨论】:

      • 你能解释一下代码契约为什么或如何导致这个问题吗?
      • 没有解释。通过设置另一台机器对其进行测试,验证其工作正常,然后安装代码合约,导致出现问题。
      • 这不仅仅是我的设置,完全相同的事情也发生在我的同事身上。在 Visual Studio 2012 中运行完全相同的解决方案并在即时窗口中发出命令可以正常工作。切换回VS2010,问题依旧。
      • 我没有安装代码合约并看到同样的问题
      猜你喜欢
      • 1970-01-01
      • 2010-11-21
      • 2011-02-15
      • 1970-01-01
      • 2012-09-05
      • 2011-11-21
      • 2021-12-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多