有时我在C#中创建了一个命名空间(我不知道VB.NET中的问题是否相同),并且当我从一个不同的DLL中包含它时,它变得疯狂并且与包含的内容发生冲突'系统'。这导致了如下的疯狂错误:
类型或命名空间名称 'ServiceModel'不存在于 命名空间'RR.System'
类型或命名空间名称'Runtime' 在命名空间中不存在 'RR.System'
类型或命名空间名称 'SerializableAttribute'不存在 在命名空间'RR.System'
中
如果你不知道我在说什么,那么对你有好处:)我相信很多人已经看到了这个问题。
我不完全确定为什么会这样做。即使在文件中也会出现这种情况,例如生成的Web服务代码不包含对RR.System
的任何引用。
这一切都只是因为我将DLL RR.System
包含在另一个项目中而发生。
我怎样才能避免这种情况发生?还是解决它?
答案 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。*这非常烦人且令人困惑。不用说,我使用别名