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

时间:2009-02-24 05:25:46

标签: c# .net

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

  

类型或命名空间名称   'ServiceModel'不存在于   命名空间'RR.System'

     

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

     

类型或命名空间名称   'SerializableAttribute'不存在   在命名空间'RR.System'

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

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

这一切都只是因为我将DLL RR.System包含在另一个项目中而发生。

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

9 个答案:

答案 0 :(得分:6)

现在,您为什么要将项目称为“系统”?

答案 1 :(得分:6)

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

global::System.ServiceModel

答案 2 :(得分:4)

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

System.Abc.Xyz.Type

无关
Abc.Xyz.System.Type

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

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

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

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

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

Stack Overflow Q:Is global:: a bad code smell in C#?
MSDN文章:How to: Use the Namespace Alias Qualifier

答案 3 :(得分:1)

无法使用简写方法引用这两个命名空间。你要么必须重命名你的类来防止碰撞,要么像你这样对你的类进行别名(这需要你改变你的代码中的引用来使用别名)......

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

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

答案 4 :(得分:1)

这让我想起了一个老笑话 - Compiler, It hurts when I do this

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

您始终可以使用aliasing来确保您的代码明确引用项目中的正确代码。

顺便说一句,在Framework Design Guidelines中,Brad Abrams提供了大量最佳实践信息。

答案 7 :(得分:0)

我公司主要项目的命名空间分为几个层次:

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

其中*将根据功能进一步细分

答案 8 :(得分:0)

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