【问题标题】:Can two classes with the same name be in the same namespace across two different assemblies?两个同名的类可以跨两个不同的程序集在同一个命名空间中吗?
【发布时间】:2019-01-14 17:22:41
【问题描述】:

我有两个不同的程序集:Assembly1Assembly2。两个程序集都使用相同的命名空间SoftwareDrivers。现在,我有两个具有相同功能的类的实现,只是不同的实现和依赖项将一个实现绑定到Assembly1,另一个绑定到Assembly2;我会打电话给这个类PackageWriter

有些项目可能需要同时引用这两个程序集,因此我预计在解决在该场景中使用哪个PackageWriter 时会出现问题。是这样吗?如果是这样,解决这个问题的唯一方法是,在不改变项目结构的情况下,改名为PackageWriter?c

【问题讨论】:

  • 为什么不简单地尝试一下呢?恕我直言,如果两个类具有相同的名称(甚至相同的命名空间)但做不同的事情,它会闻起来。
  • extern alias。有一些功能可以帮助您处理这些问题,但通常这表明您没有选择足够好的名称。 IE。实际上区分使用assembly1 的PackageWriter 与使用assembly2 的PackageWriter,为什么不是名称的一部分?
  • 如果他们有“相同的功能但不同的实现”,那么为什么不选择一个实现更好的并在两个地方都使用呢?
  • @RufusL - 如果一个实际上应该命名为XmlPackageWriter 和另一个ASN1PackageWriter,那么两者都不一定比另一个更好,但正如我上面所说,它指向命名失败。
  • @Damien_The_Unbeliever 我想我不明白为什么在同一个命名空间中有两个不同的方法具有 相同 功能。也许它应该被表述为类似功能?

标签: c# namespaces .net-assembly


【解决方案1】:

是的,他们可以。如果两个程序集都被引用,您将收到类似以下的错误:

error CS0433: The type 'Testing' exists in both 'MyApp.Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' and 'MyApp.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'

请注意,您永远不应该故意将自己置于这种情况下。但是,如果您出于某种原因发现自己处于必须处理此问题的境地:

每个程序集在 .NET 中都有一个“别名”,默认为 global。这对于日常程序员来说通常是不可见的。您可以通过单击引用并更改属性中的别名来更改别名。然后,您可以通过在文件顶部添加 extern alias myalias 来引用它,而实际类引用如下 myalias::MyApp.Testing

在运行 2 个版本的 API 或类似版本时可能需要这样做,但我坚持尽可能避免这种情况。

更多详情,请参阅this answer

【讨论】:

    【解决方案2】:

    如果它在同一个命名空间中,则否,除非您将其声明为 partial

    【讨论】:

    • partial 只能在单个程序集中工作。这是一个编译时特性。
    猜你喜欢
    • 2015-10-20
    • 2011-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-12
    • 1970-01-01
    相关资源
    最近更新 更多