我的命名空间有什么问题?

时间:2010-02-11 14:38:05

标签: c# namespaces

我正在重命名项目中的命名空间。我发现了一件奇怪的事情,无法理解为什么会这样?

原始结构:

namespace Mycompany.Util
{
    public class Util{
        public static void ReadDictionaryFile()
        {
        }
    }
}

在另一个档案中

using MyCompany.Util;

namespace Logging {
    public class Log {
        public void MethodB() {
            ...
            Util.ReadDictionaryFile();
            ...
        }
    }
}

以上工作正常,没有编译错误。

然后我将Logging命名空间更改为MyCompany.Logging,我在MethodB中立即收到错误告诉我

"Error 5 The type or namespace name 'ReadDictionaryFile' does not exist in the namespace 'MyCompany.Util' (are you missing an assembly reference?) C:\workspace\SystemSoftware\SystemSoftware\src\log\Log.cs 283 61 SystemSoftware
"

我必须将该函数调用从Util.ReadDictionaryFile()更改为MyCompany.Util.Util.ReadDictionaryFile()我不知道为什么?系统库中是否有另一个Util类?

遵循整个使用线:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using MyCompany.Util;

修改

在C#中,当我们调用静态方法时,我们必须这样调用:namespace.classname.methodname? 好的,我只是来自Java。在Java中,使用import MyCompany.Util.*;后,您可以使用以下格式调用静态方法:className.methodName;,不需要包名称。

EDIT2:

C#和Java是相同的,如果我们正确使用命名空间,className.methodName;就足以调用静态方法。

5 个答案:

答案 0 :(得分:11)

  

MyCompany.Util.Util.ReadDictionaryFile()

这是namespace.namespace.class.method,在您的第一个代码块中定义。

是的,如上所述,拼写错误可能无济于事。

编辑:此代码示例编译正常。

namespace MyCompany.Util
{
    public class Util
    {
        public static void ReadDictionaryFile()
        {
        }
    }
}

namespace MyCompany.Logging
{
    using MyCompany.Util;

    public class Log
    {
        public void MethodB()
        {
            Util.ReadDictionaryFile();
        }
    }
}

如果我取出using指令,那么我必须完全限定命名空间,除非默认命名空间是MyCompany,在这种情况下你只需要限定Util < em> namespace ,Util.Util.ReadDictionaryFile()

答案 1 :(得分:10)

问题在于,当您将父命名空间MyCompany添加到Logging时,编译器会将Util解析为Util中的MyCompany命名空间命名空间而不是Util命名空间中的MyCompany.Util类。

答案 2 :(得分:3)

Log命名空间内MyCompany.Logging类的上下文中,Util本身引用Util命名空间下的MyCompany命名空间。您也可以写MyCompany.Util.Util.ReadDictionaryFile()而不是Util.Util.ReadDictionaryFile()。您已经在命名空间和类之间创建了歧义,并且在您的使用环境中,它首先解析为命名空间。

您可以将MyCompany.Util更改为MyCompany.Utilities。或者,您可以更改using语句,为Util类提供别名,例如:

using Utils = MyCompany.Util.Util;

//usage
Utils.ReadDictionaryFile();

答案 3 :(得分:2)

你应该首先不引起问题来解决问题。 永远不要给类和它的名称空间命名相同的名称。框架设计指南明确指出这是一个糟糕的编程实践。不要违反框架设计指南;这是一个痛苦的食谱。

它是一种可怕的做法的原因是因为它导致编译器在你指的是命名空间或类型时无法消除歧义;它总是挑选一个或另一个,并经常挑选你不想要的那个。

避免,避免,避免。

答案 4 :(得分:1)

好的,我会回答......

using MyCompany.Util;

namespace Mycompany.Util
{
 ...
}

// does not exist in the namespace 'MyCompany.Util'

你看到了区别吗?

编辑:即使这不是问题,你的拼写错误也让任何人都难以回答你的问题。你必须准确。在学术界,你可能甚至不会对这样的问题做出回应。