尝试在解决方案ExpertSystem
中构建项目ExpertSystem
时出现了一个奇怪的错误:
错误1类型名称“App”没有 存在于该类型中 'ExpertSystem.ExpertSystem'D:\ Users \ Kirill \ Documents \ Visual 工作室 2010 \ Projects \ ExpertSystem \ ExpertSystem \ obj \ x86 \ Debug \ App.g.cs 60 26 ExpertSystem
我甚至不知道VS在构建时会创建此文件。所以,我开始在代码的最后编辑中搜索问题,发现问题出在我的上一课:
namespace ExpertSystem
{
public class ExpertSystem
{
//...
}
}
当班级名称更改为与ExpertSystem
不同的名称时,项目编译没有错误。
任何人都可以解释一下,我真的可以在C#中使用与namespace / project / solution同名的类吗?或者这是某种VS / WPF错误?
感谢。
答案 0 :(得分:5)
VS为每个XAML文件生成部分类(不是在构建期间,但在设计期间),以便(例如)将命名组件声明并填充为类字段。
如果您想轻松阅读设计器生成的App.g.css文件的内容(与App.xaml和App.xaml.cs文件相关联),请转到App.xaml.cs文件并执行“转到类构造函数中的InitializeComponent()函数调用上的“定义”。我不知道你的潜伏着什么,但我希望设计师能够产生这样的东西(也许不是这个,但问题会是一样的):
var foo = (SystemExpert.App)(Application.Current)
应该理解为:
var foo = (global::SystemExpert.App)(Application.Current)
现在,如果在SystemExpert程序集名称空间中创建SystemExpert类,并且同样在SystemExpert名称空间中声明App类,编译器将理解:
var foo = (global::SystemExpert.SystemExpert.App)(Application.Current)
^^^^^^^^^^^^^^^^
the current namespace
以与命名空间完全相同的方式命名类是不好的做法:它可能会混淆编译器。
答案 1 :(得分:4)
任何人都可以解释一下,我真的可以在C#中使用与namespace / project / solution同名的类吗?
是的,你可以。它是C#语言的一部分。
因此,编译器无法确定代码是否要在ExpertSystem.ExpertSystem
命名空间中查找ExpertSystem
命名空间或ExpertSystem
类。 (嗯,它可以,但它错了。)
答案 2 :(得分:1)
使用一个解决方案来补充BoltClock's answer,同时保持命名空间和类名不变:
错误在名为App.g.cs
的文件中报告,该文件由编译器生成。因此,修复该文件中的问题无济于事,因为下次编译时文件将被错误覆盖(或者在将代码复制到另一台机器后重写)。
但是,您可以更改App.xaml
文件,从中生成App.g.cs
。该文件的根元素将以
<Application x:Class="ExpertSystem.App"
在那里,应该找到名称空间ExpertSystem
,但是如果类具有相同的名称,则编译器会假定App
是成员或类{{1}中的嵌套类型}}
通过思考这个问题,你会发现编译器首先会尝试相对于ExpertSystem.ExpertSystem
命名空间来评估x:Class
属性的值。此行为是您的问题的原因,但是我们现在知道行为的具体情况,我们可以相应地编写代码 - 使用相对于命名空间ExpertSystem
限定的标识符:
ExpertSystem
在此更改之后,即使命名空间和类都命名为<Application x:Class="App"
,它也应该编译正常。