C# 如何在C语言中不使用USE编写语句#

C# 如何在C语言中不使用USE编写语句#,c#,linq,extension-methods,C#,Linq,Extension Methods,我有一个(调试)需要*来编写以下语句: using System.Diagnostics; using System.Linq; // ... Enumerable.Range(0, 10).ToList().ForEach(x => Debug.WriteLine(x)); 但不使用using,例如: System.Linq.Enumerable.Range(0, 10).ToList().ForEach(x => System.Diagnostics.Debug.WriteLi

我有一个(调试)需要*来编写以下语句:

using System.Diagnostics;
using System.Linq;
// ...
Enumerable.Range(0, 10).ToList().ForEach(x => Debug.WriteLine(x));
但不使用using,例如:

System.Linq.Enumerable.Range(0, 10).ToList().ForEach(x => System.Diagnostics.Debug.WriteLine(x));
但由于ToList上下文未知,因此无法编译: 错误CS1061:“IEnumerable”不包含“ToList”的定义,并且找不到接受“IEnumerable”类型的第一个参数的扩展方法“ToList”(是否缺少using指令或程序集引用?)

我的问题是:如何为ToList()指定名称空间上下文

*这是一个人为的例子。实际上,我需要一种在运行时在调试器即时窗口中迭代数据/函数的方法,在某些情况下,执行可能不在System.Linq的上下文中


使用Visual Studio 2015,您可以将扩展方法作为静态方法调用:

System.Linq.Enumerable.ToList(System.Linq.Enumerable.Range(0, 10))
    .ForEach(x => System.Diagnostics.Debug.WriteLine(x));
System.Linq.Enumerable.ToList(System.Linq.Enumerable.Range(0, 10))
                      .ForEach(x => System.Diagnostics.Debug.WriteLine(x));
但是,您不能从调试器中的
ForEach
调用
Debug.WriteLine
,但调试器仍将显示结果:

System.Linq.Enumerable.ToList(System.Linq.Enumerable.Range(0, 10))

我建议您将重点放在真正的需求上,而不是讨论如何在代码中实现这一点,这实际上在最后一段中。此时在调试器中尝试执行此操作时会发生什么情况?在Visual Studio 2017中,如果将插入符号移动到上面代码段中的,例如,
.ToList()
,则可以按F12(转到定义)或Alt+F12(Peek定义)显示的反射版本,或按F1显示类似的内容。您可以从其中任何一个中确定定义扩展方法的命名空间和类。“在调试器中执行”的问题在于,在这种特定情况下,我没有调试成我立即可用和/或可以重新编译的代码。我需要评估其他地方的更改对内部运行时生成的数据的前后影响,我想看看是否可以在运行时生成不修改源的比较结果。我希望即时窗口可以提供这样做的手段,但显然不行。我最终能够通过在调用堆栈上添加一些调试诊断代码并检查结果来收集所需的数据。我认为在即时窗口中无法做到这一点…@RufusL-true,但它确实回答了OP的问题,这不是他们的最终目标。@Mosallem-添加一些文本,解释可以通过直接引用定义方法的静态类来调用扩展方法,这将改进您的答案。谢谢,这回答了我的问题。最终调用失败,原因如下:方法System.Collections.Generic.List`1[System.Int32].ForEach()调用本机方法System.Diagnostics.Debugger.IsLogging()。不支持在此上下文中计算本机方法。@BretPehrson是的,您的问题是您正在调用调试程序无法计算的
Debug.WriteLIne
。但是您可以关闭
ForEach
,因为调试器将为您输出结果。是的,这就是我发现的,谢谢。即时窗口功能强大,但不足以满足我的需要。