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>
}