C# 11 - 通过向此方法添加 IAdditionOperators 我们获得了什么?

Avr*_*oel 5 c# c#-11.0 .net-7.0 .net-generic-math

我刚刚将 Visual Studio 2022 升级到 .NET7,其中包括 C# 11。我有兴趣尝试新的静态抽象接口方法,因此按照那里的教程进行操作。

本文展示了如何定义PointTranslation记录使用新IAdditionOperators<>接口...

public record Translation<T>(T XOffset, T YOffset) where T : IAdditionOperators<T, T, T>;

public record Point<T>(T X, T Y) where T : IAdditionOperators<T, T, T> {
  public static Point<T> operator +(Point<T> left, Translation<T> right) =>
    left with { X = left.X + right.XOffset, Y = left.Y + right.YOffset };
}
Run Code Online (Sandbox Code Playgroud)

这使您能够执行此操作...

var pt = new Point<int>(3, 4);
var translate = new Translation<int>(5, 10);
var final = pt + translate;
Run Code Online (Sandbox Code Playgroud)

接下来它说...

您可以通过声明这些类型实现适当的算术接口来提高此代码的可重用性。要做的第一个更改是声明Point<T, T>实现IAdditionOperators<Point<T>, Translation, Point> interface. ThePoint type makes use of different types for operands and the result. ThePoint` 类型已经实现了具有该签名的运算符 +,因此将接口添加到声明中就足够了:

public record Point<T>(T X, T Y) : IAdditionOperators<Point<T>, Translation<T>, Point<T>>
    where T : IAdditionOperators<T, T, T>
Run Code Online (Sandbox Code Playgroud)

我很难理解这一点。在添加额外的实现部分之前,您可以将 a 添加Translation到 a Point,如上面的代码所示,以及我引用的段落的最后一行中所解释的。

: IAdditionOperators<Point<T>, Translation<T>, Point<T>>问题1:通过在声明中插入 ,我们得到了什么Point

问题 2:这如何使代码更具可重用性?它似乎没有启用任何以前不起作用的东西。

之后文章继续讨论附加身份特征,这似乎是一个单独的点。

任何人都可以解释我在这里缺少什么吗?

Gur*_*ron 7

例如,它允许定义以下通用方法并将其与Point<T>and一起使用Translation<T>(即对加法运算进行一般抽象):

public static T AddAll<T, TOther>(T t, List<TOther> c) where T : IAdditionOperators<T, TOther, T>
{
    foreach (var item in c)
    {
        t = t + item;
    }

    return t;
}
Run Code Online (Sandbox Code Playgroud)

以及用法(可能由于接口介绍):

Point<int> p = AddAll(new Point<int>(1, 1), new List<Translation<int>>());
Run Code Online (Sandbox Code Playgroud)