c# - 使用 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
?
解决方案
有一种方法可以通过将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
甚至没有(直接)使用这个库中的任何东西。这就是为什么我没有选择这个答案作为接受的答案