Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何减少C#中不同类型上类似函数的重复代码_C# - Fatal编程技术网

如何减少C#中不同类型上类似函数的重复代码

如何减少C#中不同类型上类似函数的重复代码,c#,C#,我有两个函数,它们做的基本相同,但一个是基于浮点的版本,另一个是基于int的版本。我不得不写两次,这让我发疯。有没有一种聪明的方法来设计我的代码,以避免在C#中出现这种情况,我在这两种类型中添加的函数越多,它们本质上具有相同的行为,这就变得越乏味 public static Span2D operator +(Span2D A, Span2D B) { float minX = A.MinX < B.MinX ? A.MinX : B.MinX;

我有两个函数,它们做的基本相同,但一个是基于浮点的版本,另一个是基于int的版本。我不得不写两次,这让我发疯。有没有一种聪明的方法来设计我的代码,以避免在C#中出现这种情况,我在这两种类型中添加的函数越多,它们本质上具有相同的行为,这就变得越乏味

    public static Span2D operator +(Span2D A, Span2D B)
    {
        float minX = A.MinX < B.MinX ? A.MinX : B.MinX;
        float minY = A.MinY < B.MinY ? A.MinY : B.MinY;
        float maxX = A.MaxX > B.MaxX ? A.MaxX : B.MaxX;
        float maxY = A.MaxY > B.MaxY ? A.MaxY : B.MaxY;
        return new Span2D(minX,minY,maxX,maxY);
    }

    public static Span2DInt operator +(Span2DInt A, Span2DInt B)
    {
        int minX = A.MinX < B.MinX ? A.MinX : B.MinX;
        int minY = A.MinY < B.MinY ? A.MinY : B.MinY;
        int maxX = A.MaxX > B.MaxX ? A.MaxX : B.MaxX;
        int maxY = A.MaxY > B.MaxY ? A.MaxY : B.MaxY;
        return new Span2DInt(minX, minY, maxX, maxY);
    }
公共静态Span2D运算符+(Span2D A、Span2D B)
{
float minX=A.minXB.maxX?A.maxX:B.maxX;
float maxY=A.maxY>B.maxY?A.maxY:B.maxY;
返回新的Span2D(minX、minY、maxX、maxY);
}
公共静态span2dit运算符+(span2dit A、span2dit B)
{
int minX=A.minXB.maxX?A.maxX:B.maxX;
int maxY=A.maxY>B.maxY?A.maxY:B.maxY;
返回新的Span2DInt(minX,minY,maxX,maxY);
}
顺便说一句,Span2D和Span2DInt都是结构体。

使用泛型:

struct Span2D<Type: IComparable> {
    Type MinX { get; };
    Type MaxX { get; };
    ...
}

public Span2D<Type> operator+(Span2D<Type> A, Span2D<Type> B) {

    Type minX = A.MinX < B.MinX ? A.MinX : B.MinX; // as normal...

}
struct Span2D{
输入MinX{get;};
键入MaxX{get;};
...
}
公共Span2D运算符+(Span2D A、Span2D B){
键入minX=A.minX
泛型是否需要IComparable?是的,这样您就可以比较>/但您并没有尝试使用
IComparable
,您正在尝试使用
如果有人使用字符串类型,会发生什么情况-这不会破坏+运算符,因为返回字符串没有意义吗?为什么要删除
float
s的舍入问题?@Enigmativity更多关于它的信息现在在这里:您可以编辑您的问题,如果可以将其设置为原始问题,而不是重复问题。但您没有足够的信息来确定实际问题是什么-因此它是重复的。你需要更全面地充实你的问题,这样我们才能给你一个切实可行的答案。增加的问题是代码没有错,所以它不属于你,所以无论如何,这是一个工程问题,欢迎你对我链接的问题给出你的见解。