C# 如何以一种不那么麻烦的方式为具有约束的泛型接口编写扩展方法 接口1,其中坐标:i可比较 { 坐标位置(XYZ p); } 静态类CreateOrderOnASpaceExtensions { 公共静态IOrderedEnumerable OrderElements(此接口1 myInterface、IEnumerable elements、Func elementToPoint) 其中坐标:i可比较 => 元素。OrderBy( x=>myInterface.getPosition(elementToPoint(x)), 创建比较器((x,y)=>x.CompareTo(y) ) ); }

C# 如何以一种不那么麻烦的方式为具有约束的泛型接口编写扩展方法 接口1,其中坐标:i可比较 { 坐标位置(XYZ p); } 静态类CreateOrderOnASpaceExtensions { 公共静态IOrderedEnumerable OrderElements(此接口1 myInterface、IEnumerable elements、Func elementToPoint) 其中坐标:i可比较 => 元素。OrderBy( x=>myInterface.getPosition(elementToPoint(x)), 创建比较器((x,y)=>x.CompareTo(y) ) ); },c#,C#,我真的应该在扩展方法声明中编写where-coordinable:IComparable 我已经说过,当我创建接口1时,坐标是可比较的 没有这一点: 没有从坐标到可比坐标的装箱转换或类型参数转换 我将使用==来显示在每个通用定义中应用于哪个部分: interface interface1<Coordinate> where Coordinate : IComparable<Coordinate> { Coordinate getPosition(XYZ p); }

我真的应该在扩展方法声明中编写
where-coordinable:IComparable

我已经说过,当我创建
接口1
时,
坐标
是可比较的

没有这一点:

没有从坐标到可比坐标的装箱转换或类型参数转换


我将使用
==
来显示在每个通用定义中
应用于哪个部分:

interface interface1<Coordinate> where Coordinate : IComparable<Coordinate>
{
    Coordinate getPosition(XYZ p);
}

static class CreateOrderOnASpaceExtensions
{
    public static IOrderedEnumerable<T> OrderElements<Coordinate, T>(this interface1<Coordinate> myInterface, IEnumerable<T> elements, Func<T, XYZ> elementToPoint)
        where Coordinate : IComparable<Coordinate>
    =>
    elements.OrderBy(
        x => myInterface.getPosition(elementToPoint(x)),
        Comparer<Coordinate>.Create((x, y) => x.CompareTo(y)
        )
    );
}
接口1
==========
其中坐标:i可比较
{
...
}

静态类CreateOrderOnASpaceExtensions
{
公共静态IOrderedEnumerable OrderElements(此接口1 myInterface、IEnumerable elements、Func elementToPoint)
==========
其中坐标:i可比较
}
如果没有第二个
where
,编译器将看到您试图将一个无约束类型
坐标
(可以是任何东西)输入到有约束的
接口1
,这使得不允许使用无约束的
坐标

interface1
有一个约束的事实并不意味着如果你试图连接它,它之外的“世界”也会神奇地受到限制;在允许之前,它已经需要安装


打个比方:你建造了一条需要火车的铁路。你首先需要做一列火车,然后你就可以上铁路了。没有什么魔法能让你放在上面的任何车辆成为火车。

顺便说一句,我发现
Coordinate
是一个类型参数名,这让人很困惑。我建议遵循正常的.NET命名约定,将其设置为
tcoordination
,然后重命名接口(从
interface1
)和其中的方法(从
getPosition
)。你的问题代码越现实,干扰就越小。这段代码的最终目标感觉有点做作,我感觉到一个XY问题,但没有上下文,不清楚这种方法是否有效。我怀疑你可能在做一些你不太需要的事情,但我们需要看看上下文来准确判断。
interface interface1<Coordinate>
                     ==========
                     where Coordinate : IComparable<Coordinate>
{
    ...
}
static class CreateOrderOnASpaceExtensions
{
    public static IOrderedEnumerable<T> OrderElements<Coordinate, T>(this interface1<Coordinate> myInterface, IEnumerable<T> elements, Func<T, XYZ> elementToPoint)
                                                      ==========
                                                      where Coordinate : IComparable<Coordinate>
}