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

2024-03-09

我们可以使用新的INumber<TSelf>界面 https://learn.microsoft.com/en-us/dotnet/api/system.numerics.inumber-1?view=net-7.0在 .NET 7 中引用任何数字类型,如下所示:

using System.Numerics;

INumber<int> myNumber = 72;
INumber<float> mySecondNumber = 93.63f;

然而,由于类型限制INumber,我们不能有一个可以容纳任何数字类型的通用引用。以下代码无效:

using System.Numerics;

INumber myNumber = 72;
myNumber = 93.63f;

我怎样才能有一个任何数字对象的数组并调用一个期望的方法INumber<TSelf> object.

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;

TL;博士:你不能。


您注意到没有非泛型类型INumber which INumber<TSelf>实施,因为这会造成严重破坏。

当您必须声明时,您知道代码中发生了不好的事情

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

握住你的INumber<T> values.

您也无法声明,例如就像是

var numbers = new INumber<>[] { 1, 2.5, 5, 0x1001, 72 };

因为你会遇到CS7003 https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/compiler-messages/cs7003: "意外使用未绑定的通用名称"


假设存在一个非泛型接口类型INumber这是一个基本类型INumber<TSelf>(同样的方式IEnumerable是一个基本类型IEnumerable<T>).

For INumber为了有用,它必须有像运算符这样的东西 - 但这些也必须是非通用的 - 因此,例如,非通用版本的IAdditionOperators<TSelf,TOther,TResult>界面 https://learn.microsoft.com/en-us/dotnet/api/system.numerics.iadditionoperators-3(它定义了+运算符)必须存在 - 它必须采取INumber, INumber作为其论点。

现在,假设你有一个类型,UserDefinedNumber : INumber<UserDefinedNumber>你有

INumber a = 1d;
INumber b = new UserDefinedNumber(...);
var c = a + b;

现在——你会期待什么a + b to do?

由于运算符的左侧和右侧都键入为INumber,编译器将使用+操作符开启a(这是一个double)但由于这是一个内置类型,因此它不可能有任何逻辑来处理添加double to a UserDefinedNumber.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 .NET 7 中为 Number 提供通用变量? 的相关文章

随机推荐