如何在没有冲突的情况下在.NET中创建包含“System”的命名空间?

有时我在C#(我不知道VB.NET中的问题是否相同)中创建了一个包含’System’的命名空间,当我从一个不同的DLL中包含它时,它变得疯狂并与包含’System’的所有内容冲突。 这会导致疯狂的错误,如下所示:

命名空间“RR.System”中不存在类型或命名空间名称“ServiceModel”

命名空间“RR.System”中不存在类型或命名空间名称“Runtime”

命名空间“RR.System”中不存在类型或命名空间名称“SerializableAttribute”

如果你不知道我在说什么,那么对你有好处:)我相信很多人都看过这个问题。

我不完全确定为什么会这样做。 它甚至会出现在文件中,例如生成的Web服务代码,它不包含对RR.System任何引用。

这一切都只是因为我将RR.System包含在一个不同的项目中。

我怎样才能避免这种情况发生? 还是解决它?

我仍然不明白为什么命名空间与命名空间冲突? 命名空间下的所有类型都可以是完全限定的,完全限定的名称引用不同的类型。 例如

 System.Abc.Xyz.Type 

没有任何关系

 Abc.Xyz.System.Type 

第一种情况下的System是指完全不同的概念(指南下的公司名称),而第二种情况下的System可以指产品或子系统名称。

如果根命名空间可能会导致这种干扰,那么这肯定是一个大问题,因为我可能会选择调用我的新雨林监控产品Amazon并将我的所有类型都放在MyCompany.Amazon下。 然后,我可能会选择使用S3存储来存储我的数据,然后亚马逊命名空间突然导致冲突。

我们遇到了同样的问题,因为我们的项目分为3个主要子系统 – 数据库,用户和系统。 在MyCompany根命名空间下,这些似乎是明显的子命名空间。

请记住,这与使用语句无关,因为Simon说“即使在文件中也会发生这种情况,例如生成的Web服务代码不包含对RR.System的任何引用”

更新:以下Stack Overflow问题沿着相同的路线。 然而,它指出的MSDN文章讨论了一个名为System的类名称隐藏命名空间(足够公平),并且还使用System作为顶级命名空间(足够公平)。 但是,它没有讨论为什么子命名空间与根节点名称冲突。

Stack Overflow问: 全局:: C#中的代码异味吗?
MSDN文章: 如何:使用命名空间别名限定符

奇。

现在,你为什么称你的项目为“系统”?

为避免混淆,您可以完全限定命名空间引用:

 global::System.ServiceModel 

等等

没有办法使用速记方法引用两个名称空间。 你要么必须重命名你的类来防止碰撞,要么像你这样重命别你的类(这将要求你改变代码中的引用来使用别名)……

 Using System; // The namespace seen and used in all .cs files Using Sys = RR.System; // Just replace -your- 'System' references with 'Sys' 

虽然这种方法在C#中是合法的,但它很混乱并建议重命名引用的类。

这让我想起了一个古老的玩笑 – 编译器,当我这样做时会很痛

如果您有选项,您可能需要考虑将命名空间重命名为SystemUtilities等,或者您可以完全限定所有其他可能非常痛苦的引用。 与BCL的歧义可能导致一些令人讨厌的代码。

如果您的项目包含对System和您的自定义库(RR.System)的引用,则编译器将有一个不明确的引用来进行排序。 它不确定你想要哪一个。

您始终可以使用别名来确保您的代码显式引用项目中的正确代码。

顺便说一句,Brad Abrams在框架设计指南中提供了大量最佳实践信息。

我公司主要项目的名称空间分为几个级别:

Company.au.ProductName.GUI。*
Company.au.ProductName.Data。*

其中*将根据function进一步细分

我的公司使用Company.Group.Platform.Application.Layer.Component。*这非常烦人且令人困惑。 不用说,我使用别名