【问题标题】:How to assign same class object declared in 2 different namespaces如何分配在 2 个不同命名空间中声明的相同类对象
【发布时间】:2011-03-18 03:32:12
【问题描述】:

我有一个带有类的 webservice 项目(我们将其称为 webservice.classA)。

我有另一个类项目生成一个 dll,它在自己的命名空间中引用该类并实例化它的一个实例(让我们调用 dlls 命名空间 dllnamespace)。

在另一个项目中我想访问 dll 中的成员

例如

using webservice;

namespace other_project
{
    class B
    {
        classA copy = null;
        //....
        dllnamespace.dostuff(); // amongst other things instantiates a classA object
        //....
        copy = dllnamespace.getclassA(); // method to return classA member

我得到的编译器错误是无法将类型从 dllnamespace.webservice.classA 转换为 other_project.webservice.classA

我想我有一个基本的设计缺陷,但我认为必须有(?)一种在多个命名空间中声明/使用“webservice.classA”的方法。

【问题讨论】:

    标签: c# class namespaces


    【解决方案1】:

    将复制定义行改为:

    dllnamespace.webservice.classA copy = null;
    

    【讨论】:

      【解决方案2】:

      你有名字冲突。避免这种情况的支持方法(不将您的类命名为相同)是为其中一个类定义一个using alias

      using webservice.classA = myWebserviceClassA;
      

      【讨论】:

      • @Shankar,支持以这种方式声明别名。随意检查编译器:-)(顺便说一下,它对应于答案中链接的第二个示例)。
      • 我知道这与吹毛求疵 :-) ... 但刚刚检查了我的 VS 2008 ... 在右侧有别名确实会产生编译器错误。假设 -myWeberviceClassA -... 出现在等式的 .. 左侧... :-) ... 这是正确的。
      【解决方案3】:

      这就是问题所在——你不能在多个命名空间中拥有一个类。这就是命名空间的设计目的——防止不同人编写的具有相同名称的类出现别名。您需要决定让一个命名空间拥有该类,并在另一个命名空间中导入它。或者,如果 dll 和 Web 服务是同一个分布式应用程序的一部分,那么它们应该使用相同的命名空间。

      【讨论】:

      • 我对命名空间很陌生(很明显)。我怀疑你是对的,在这种情况下,“其他”项目具有相同的命名空间是有意义的。
      【解决方案4】:

      你说得对……在命名方面确实存在设计缺陷。

      让我们假设:

      • 你有一个名为 MyClass

      • 该类存在 both 命名空间 - abc.xyz.qwe.tyu.MyClass

      • 在命名空间中 - sed.qwe.dfg.ert.MyClass

      解决方法是 -

      using NS1 = abc.xyz.qwe.tyu.MyClass;
      using NS2 = sed.qwe.dfg.ert.MyClass;
      

      这样可以避免冲突。 此外,如果您的命名空间非常长,也很有帮助。

      进一步参考:(来自 using Directive 上的 MSDN 文章)

      • using 指令的范围是 仅限于它所在的文件 出现。

      • 创建一个 使用 别名,以便更轻松地将标识符限定为 命名空间或类型。

      • 创建一个 using 指令以使用命名空间中的类型,而无需指定命名空间。 using 指令不允许您访问嵌套在您指定的命名空间中的任何命名空间。

      【讨论】:

        猜你喜欢
        • 2015-11-11
        • 2016-09-16
        • 1970-01-01
        • 2012-02-27
        • 2016-12-25
        • 2017-06-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-31
        相关资源
        最近更新 更多