为什么 Linq 方法会出现相同的命名空间错误?
Why same namespace errors for Linq methods?
我重构了我的小项目,以更正名称空间和 class 名称。在此过程中的某个地方,出现了一些问题,我收到了与 Linq 方法相关的编译错误,直到我使用 ObservableCollection class 文件中的随机命名空间修复它。 linq 错误仅与 ObservableCollection 有关,与 winform 中的任何其他对象无关。
这感觉像是一个 Visual Studio 错误,因为我觉得我已经检查了所有内容。
我在同一个项目中有一个 winform、一个 class(MyObject) 和另一个 class(ObservableCollection)。
它们都有对 System.Linq 的引用,并且都有 MyProject.ProjectCategory
的命名空间
winform 是这样的
using System.Linq;
namespace MyProject.ProjectCategory
private ObservableCollection<MyObject> myList;
// ...later in a method
myList.All(f => f.Title != "Test")
// the list of errors contains any Linq methods and is a long list. Here is one example
// ERROR: MyProject.ProjectCategory.ObservableCollection<MyObject> does not contain
// a definition for 'All' and no extension method 'All' accepting the first argument
// of type MyProject.ProjectCategory.ObservableCollection<MyObject>
如果我更改 class(ObservableCollection)
的命名空间,结果如下
MyProject.ProjectCategory (as above) ERROR
MyProject ERROR
Fubar COMPILES
MyProject.ProjectCategory.Fubar COMPILES
我尝试过清理、重建、删除所有 bin 和 obj 文件夹。检查所有 .Net 版本号是否相同。检查参考路径。
我可以接受 Fubar 命名空间,但如果有人有线索,我会进行修复。
您的 ObservableCollection<T>
没有实现 IEnumerable<T>
。 Linq 扩展方法只能应用于实现接口的对象:
public static bool All<T>(this IEnumerable<T>, .... )
public static IEnumerable<T> Where<T>(this IEnumerable<T>, .... )
public static T First<T>(this IEnumerable<T>, ...)
etc.
您还必须了解名称空间的工作原理。考虑以下可怕的命名空间示例,只是为了说明您的问题:
//using System; intentionally commented out
namespace System.Foo
{
class Foo
{
String s; //huh? Why is System.String addressable with
//unqualified name?
}
这里发生的是当你在内部一个命名空间A.B
块时,它会自动允许你引用命名空间A.B
中定义的所有类型] 和 A
没有完全限定他们的名字。
翻译成你的具体场景,这意味着当你的 ObservableCollection<T>
定义在命名空间 MyProject.ProjectCategory
或 MyProject
中时,你的 [=21] 中的名称 ObservableCollection
=]指的是那个类型和扩展方法调用无法解析
但是,当您将 ObservableCollection<T>
的命名空间更改为 Fubar
或 MyProject.ProjectCategory.Fubar
时,winform
中的名称 ObservableCollection<T>
将停止引用您的实现并且编译器正在将其解析为 确实 实现 IEnumerable<T>
的其他类型(可能是 System.Collections.ObjectModel.ObservableCollection<T>
),并且所有 linq 扩展方法突然开始工作。
我重构了我的小项目,以更正名称空间和 class 名称。在此过程中的某个地方,出现了一些问题,我收到了与 Linq 方法相关的编译错误,直到我使用 ObservableCollection class 文件中的随机命名空间修复它。 linq 错误仅与 ObservableCollection 有关,与 winform 中的任何其他对象无关。
这感觉像是一个 Visual Studio 错误,因为我觉得我已经检查了所有内容。
我在同一个项目中有一个 winform、一个 class(MyObject) 和另一个 class(ObservableCollection)。
它们都有对 System.Linq 的引用,并且都有 MyProject.ProjectCategory
winform 是这样的
using System.Linq;
namespace MyProject.ProjectCategory
private ObservableCollection<MyObject> myList;
// ...later in a method
myList.All(f => f.Title != "Test")
// the list of errors contains any Linq methods and is a long list. Here is one example
// ERROR: MyProject.ProjectCategory.ObservableCollection<MyObject> does not contain
// a definition for 'All' and no extension method 'All' accepting the first argument
// of type MyProject.ProjectCategory.ObservableCollection<MyObject>
如果我更改 class(ObservableCollection)
的命名空间,结果如下MyProject.ProjectCategory (as above) ERROR
MyProject ERROR
Fubar COMPILES
MyProject.ProjectCategory.Fubar COMPILES
我尝试过清理、重建、删除所有 bin 和 obj 文件夹。检查所有 .Net 版本号是否相同。检查参考路径。
我可以接受 Fubar 命名空间,但如果有人有线索,我会进行修复。
您的 ObservableCollection<T>
没有实现 IEnumerable<T>
。 Linq 扩展方法只能应用于实现接口的对象:
public static bool All<T>(this IEnumerable<T>, .... )
public static IEnumerable<T> Where<T>(this IEnumerable<T>, .... )
public static T First<T>(this IEnumerable<T>, ...)
etc.
您还必须了解名称空间的工作原理。考虑以下可怕的命名空间示例,只是为了说明您的问题:
//using System; intentionally commented out
namespace System.Foo
{
class Foo
{
String s; //huh? Why is System.String addressable with
//unqualified name?
}
这里发生的是当你在内部一个命名空间A.B
块时,它会自动允许你引用命名空间A.B
中定义的所有类型] 和 A
没有完全限定他们的名字。
翻译成你的具体场景,这意味着当你的 ObservableCollection<T>
定义在命名空间 MyProject.ProjectCategory
或 MyProject
中时,你的 [=21] 中的名称 ObservableCollection
=]指的是那个类型和扩展方法调用无法解析
但是,当您将 ObservableCollection<T>
的命名空间更改为 Fubar
或 MyProject.ProjectCategory.Fubar
时,winform
中的名称 ObservableCollection<T>
将停止引用您的实现并且编译器正在将其解析为 确实 实现 IEnumerable<T>
的其他类型(可能是 System.Collections.ObjectModel.ObservableCollection<T>
),并且所有 linq 扩展方法突然开始工作。