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)
\n\n如何拥有任何数字对象的数组并调用需要 INumber 对象的方法。
\n
问题是数组必须具有相同类型的所有元素。很简单,因为数组只是一个内存块,第 i 个元素是内存中位于地址 arrayStart + i*(elementSize) 的位置。如果大小不同,它就不会\xe2\x80\x99 工作。
\n因此,对于值类型来说这是不可能的(它们可能具有不同的大小),但是可以有对象数组,然后每个元素可以具有任何类型(在值类型的情况下将被装箱)。
\n因此,您需要创建对象数组,您可以在其中放置 float、int 等。
\n另外,我不认为\xe2\x80\x99t 认为为所有数字提供通用接口很有意义,因为如果你想将 float 添加到 long,你应该怎么做 - 转换为 float 或 long?将数字转换为最方便的任务类型会更加清晰。
\n| 归档时间: |
|
| 查看次数: |
3007 次 |
| 最近记录: |