在使用 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.NET
,Math
都被库的引用所掩盖。如果你想在那里使用 Math
作为默认值 System.Math
,你必须在其 .csproj
中包含上面显示的相同代码。
如果没有项目中 .csproj
文件中的神奇引用,甚至没有(直接)使用此库中的任何内容,为什么 Math
无法正常工作变得混乱且难以理解。这就是为什么我没有选择这个答案作为接受的答案
我在导入引入命名空间 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.NET
,Math
都被库的引用所掩盖。如果你想在那里使用 Math
作为默认值 System.Math
,你必须在其 .csproj
中包含上面显示的相同代码。
如果没有项目中 .csproj
文件中的神奇引用,甚至没有(直接)使用此库中的任何内容,为什么 Math
无法正常工作变得混乱且难以理解。这就是为什么我没有选择这个答案作为接受的答案