首页 > 解决方案 > 使用 Math 添加引用后,命名空间 System.Math 变得黯然失色。命名空间

问题描述

导入引入命名空间的包/库时遇到问题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

标签: c#.netnugetcsproj.net-5

解决方案


有一种方法可以通过将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.NET引用树中的任何位置,Math都会被库中的引用所掩盖。如果您想将其Math用作默认值System.Math,则必须将其包含在.csproj上面显示的相同代码中。

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


推荐阅读