如何在 .NET 7 中为 INumber 提供通用变量?

Jos*_*mil 5 .net c# .net-7.0 .net-generic-math

我们可以使用.NET 7中的新INumber<TSelf>接口来引用任何数字类型,如下所示:

using System.Numerics;

INumber<int> myNumber = 72;
INumber<float> mySecondNumber = 93.63f;
Run Code Online (Sandbox Code Playgroud)

但是,由于 中的类型限制INumber,我们无法拥有可以保存任何数字类型的通用引用。以下代码无效:

using System.Numerics;

INumber myNumber = 72;
myNumber = 93.63f;
Run Code Online (Sandbox Code Playgroud)

我怎样才能拥有任何数字对象的数组并调用需要对象的方法INumber<TSelf>

using System.Numerics;

object[] numbers = new object[] { 1, 2.5, 5, 0x1001, 72 };

for (int i = 0; i < numbers.Length - 1; i++)
{
    Console.WriteLine("{0} plus {1} equals {2}", numbers[i], numbers[i + 1], AddNumbers(numbers[i], numbers[i + 1]));
}

static T AddNumbers<T>(T left, T right) where T : INumber<T> => left + right;
Run Code Online (Sandbox Code Playgroud)

Vik*_*nov 2

\n

如何拥有任何数字对象的数组并调用需要 INumber 对象的方法。

\n
\n

问题是数组必须具有相同类型的所有元素。很简单,因为数组只是一个内存块,第 i 个元素是内存中位于地址 arrayStart + i*(elementSize) 的位置。如果大小不同,它就不会\xe2\x80\x99 工作。

\n

因此,对于值类型来说这是不可能的(它们可能具有不同的大小),但是可以有对象数组,然后每个元素可以具有任何类型(在值类型的情况下将被装箱)。

\n

因此,您需要创建对象数组,您可以在其中放置 float、int 等。

\n

另外,我不认为\xe2\x80\x99t 认为为所有数字提供通用接口很有意义,因为如果你想将 float 添加到 long,你应该怎么做 - 转换为 float 或 long?将数字转换为最方便的任务类型会更加清晰。

\n