【问题标题】:Namespace System.Math gets overshadowed after adding a reference with Math.<xyz> namespace使用 Math.<xyz> 命名空间添加引用后,命名空间 System.Math 变得黯然失色
【发布时间】:2021-03-25 18:23:29
【问题描述】:

导入引入命名空间 Math.Native.Gmp 的包/库时遇到问题(在 NuGet 上称为“Math.Gmp.Native”)。

在导入之前,这段代码运行良好:

using System;

namespace Sample
{
    public int Foo()
    {
        return Math.Min(1, 2);
    }
}

然而,在添加此引用后,Math 不再被识别为 System.Math,而是被新添加的命名空间隐藏 - Math. 只期望 Math.Native 作为路径的正确扩展名。

尝试使用Math.Min 会导致编译器错误:

[CS0234] 命名空间“Math”中不存在类型或命名空间名称“Min”(您是否缺少程序集引用?)

我发现原来的Math 仍然可以通过System.Math 访问,所以在上面的例子中,在添加这个前缀(return System.Math.Min(1, 2);)之后,一切都按预期工作。这是一些绕路

我的问题是 - 如何避免 Math 的阴影?我可以在文件开头使用一些using 命令来避免它吗?我可以为Math.Native.Gmp 命名空间创建一些别名,这样它就不会与System.Math 冲突?

【问题讨论】:

  • using System.Math; 也许?
  • 你可以试试using MathNativeGmp = Math.Native.Gmp;
  • @AKX Math 是一种类型,因此只有 using static System.Math; 可以编译。这是另一种解决方法 - 只需编写 &lt;xyz&gt; 即可访问 Math.&lt;xyz&gt;
  • @WombleNumber1 它创建了额外的别名,但保持 Math.&lt;xyz&gt; 不变 - 使用 Math.Min 时出现 CS0234 错误
  • 实际上@Quilir 我现在参考您正在谈论的库再次更新了它,我认为最好的解决方案是 Markus Safar 在下面给出的答案。实际上,由于 Math.Gmp.Native 的基本命名空间的不幸命名 - dotnetfiddle.net/XDPnqH,最好为“System.Math”做别名而不是相反

标签: c# .net nuget csproj .net-5


【解决方案1】:

如using statement 的文档中所述,您可以使用类似

using myMath = System.Math;

为命名空间定义别名。

【讨论】:

  • 我认为这是最好的(可能是唯一的)解决方案,因为 Math.Gmp.Native 库的基本命名空间是“Math” - 不幸的冲突。
【解决方案2】:

有一种方法可以通过将Math.Gmp.Native 命名空间移开来解决此冲突。这可以通过为该库设置别名来完成。在我们项目集的.csproj文件中(“Gmp”只是我选择的名称):

<PackageReference Include="Math.Gmp.Native.NET">
    <Aliases>Gmp</Aliases>
</PackageReference>

这样Math.&lt;xyz&gt; 不再意味着来自该库的东西,而是 - 正如预期的那样 - 来自System.Math。

在要使用导入库的文件中,必须包含:

extern alias Gmp;
using Gmp::Math.Gmp.Native;

也不会产生冲突!

巨大的警告:这个解决方案有一个很大的缺点。当你想在你的第二个项目中使用这个项目时,第二个项目将有完全相同的问题。尽管Math.Gmp.Native.NET 只是一个嵌套引用,但它会导致Math 命名空间的相同阴影。

因此,在引用树中任意位置使用Math.Gmp.Native.NET 的每个项目中,Math 都会被库中的引用所掩盖。如果你想在那里使用Math 作为默认的System.Math,你必须在它的.csproj 中包含上面显示的相同代码。

如果没有项目中 .csproj 文件中的魔法引用,甚至没有(直接)使用这个库中的任何东西,为什么 Math 不能工作会变得混乱和难以理解。这就是为什么我没有选择这个答案作为接受的答案

【讨论】:

    【解决方案3】:

    在已经给出答案的基础上建立:

    每当您遇到这种冲突时,System.Math 都会首先出现。因此,为了让事情再次正常工作,请在每个文件中使用 using 语句:

    using Math = System.Math;
    

    如果您想轻松使用其他命名空间,您可以在这里依赖@MarkusSafar 的答案并使用一些自定义别名:

    using OtherMath = /*other math namespace*/;
    

    或者只使用完全限定的名称。

    【讨论】:

    • 添加该别名会导致冲突:“[CS0576] 命名空间 '' 包含与别名 'Math' 冲突的定义”。那就是 - 来自 Math.Gmp.Native 的旧 Math 定义仍然存在
    猜你喜欢
    • 2012-10-22
    • 1970-01-01
    • 2017-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-19
    • 1970-01-01
    • 2021-05-17
    相关资源
    最近更新 更多