WPF项目的奇怪行为(类命名)

时间:2011-03-25 17:59:37

标签: c# wpf visual-studio-2010 class naming

尝试在解决方案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错误?

感谢。

3 个答案:

答案 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" ,它也应该编译正常。