我正在编写一些类,如果没有“使用System.Linq”它就不会编译。但我不明白为什么需要它。我写的与Linq无关。我怎样才能找到命名空间的使用位置? 写得非常糟糕的代码(我想弄明白我想要它做什么):
using System;
using System.Collections;
using System.Collections.Generic;
//using System.Linq;
using System.Text;
namespace DateFilename
{
public class FailedFieldsList
{
private static List<FailedFields> ErrorList = new List<FailedFields>();
public void AddErrorList(FailedFields errs)
{
ErrorList.Add(errs);
}
public void addSingleFailedField(string vField, string vMessage)
{
//FailedFields
}
public List<FailedFields> GetErrorList()
{
return ErrorList;
}
public class FailedFields
{
public List<FailedField> ListOfFailedFieldsInOneRecord = new List<FailedField>();
public class FailedField
{
public string fieldName;
public string message;
public FailedField(string vField, string vMessage)
{
this.fieldName = vField;
this.message = vMessage;
}
public override string ToString()
{
return fieldName + ", " + message;
}
}
public void addFailedField(FailedField f)
{
ListOfFailedFieldsInOneRecord.Add(f);
}
public int getFailedFieldsCount()
{
return ListOfFailedFieldsInOneRecord.Count();
}
}
}
}
当我不包含linq名称空间时产生的错误消息:
Error 4 Non-invocable member 'System.Collections.Generic.List<DateFilename.FailedFieldsList.FailedFields.FailedField>.Count' cannot be used like a method. D:\Slabo\My Documents\Visual Studio 2008\Projects\DateFilename\DateFilename\FailedFieldsList.cs 47 54 DateFilename
由于
答案 0 :(得分:6)
问题在于最后一种方法:
public int getFailedFieldsCount() {
return ListOfFailedFieldsInOneRecord.Count();
}
Count()方法不是List(T)的成员。但是,属性计数是。如果用Count替换Count(),则无需使用System.Linq即可编译。
通过包含System.Linq,您启用了扩展方法Count(),这很容易让人感到困惑。
请参阅msdn上的List(T) Members,了解列表(T)的部分内容。
答案 1 :(得分:3)
您可能正在使用System.Linq
命名空间中包含的一些扩展方法(如Distinct,Select,Where或其他一些收集方法)。构建输出窗口应该为您提供一个非常好的指示,指示必要的using语句。
编辑:
'System.Collections.Generic.List<DateFilename.FailedFieldsList.FailedFields.FailedField>.Count cannot be used like a method.
代码示例中唯一包含单词count的地方是:
ListOfFailedFieldsInOneRecord.Count()
中的 getFailedFieldsCount()
Count是System.Linq
命名空间中引入的扩展方法,即通过Enumerable静态类。
Here是此课程为您提供的所有扩展方法。
答案 2 :(得分:1)
当你删除“使用System.Linq”时,检查编译器告诉你错误的位置怎么样?
答案 3 :(得分:1)
永远不需要using
声明,因为您始终可以明确地引用System.Linq.Foo
,当您 {时,您可以引用Foo
{1}}名称空间。
因此,找出命名空间使用位置的最快速最简单的方法是尝试编译程序并查看出现错误的位置。如果using
突然未定义,那么你就找到了罪魁祸首!
答案 4 :(得分:0)
更通用(主动)的方式是使用NDepend等工具。
答案 5 :(得分:0)
一种快捷的方法是在ILDasm中打开它 - 它几乎总是显示代码中使用的每种类型和方法的完整命名空间......但是你可以使用Reflector来使你可以从IL切换到C#...当然你需要首先编译它:)