在使用 Math.<xyz> 命名空间添加引用后,命名空间 System.Math 变得黯然失色

Namespace System.Math gets overshadowed after adding a reference with Math.<xyz> namespace

我在导入引入命名空间 Math.Native.Gmp 的 package/library 时遇到问题(在 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] The type or namespace name 'Min' does not exist in the namespace 'Math' (are you missing an assembly reference?)

我发现原来的 Math 仍然可以通过 System.Math 访问,所以在上面的例子中,在添加这个前缀 (return System.Math.Min(1, 2);) 之后一切正常。这是一些解决方法

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

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

using myMath = System.Math;

为命名空间定义别名。

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

每当您遇到这种冲突时,System.Math 就会第一个出现。所以为了让事情再次工作,请在每个文件中使用 using 语句:

using Math = System.Math;

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

using OtherMath = /*other math namespace*/;

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

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

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

这样一来,Math.<xyz> 就不再代表那个图书馆的东西了,而是 - 正如预期的那样 - 来自 System.Math.

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

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

也不会产生冲突!

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

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

如果没有项目中 .csproj 文件中的神奇引用,甚至没有(直接)使用此库中的任何内容,为什么 Math 无法正常工作变得混乱且难以理解。这就是为什么我没有选择这个答案作为接受的答案