2

嘿,

我一直在寻找但找不到任何合适的答案......也许指出我。

所以我有一个接口和一个 Point 类:

interface IDoable<T>{
    void DoSomething<T>(T ) ;
}
class Point<T>:IDoable <T>{ 
    public T x;
    public T y;
    public Point(T x, T y){

        this.x = x;
        this.y = y;
    }
    public void DoSomething<T>(Point<T> p){
        p.x += 10;
        p.y += 10;
    }
}

但它告诉我我不能这样做,因为 int 不能转换为 T。

我需要接口能够采用任何类型的 Point,无论是 int、float 还是 double 或其他类型并修改值。有任何想法吗?

4

2 回答 2

2

您正在尝试将 10(整数)添加到 type 的值TT可以是整数、日期时间、列表或其他一些自定义类。这意味着绝对不能保证您T将能够将自己添加到整数。

不幸的是,在 C# 中无法添加泛型类型约束,将参数限制为支持特定操作的类型。

有解决方法,但它们很丑陋。即你可以有:

class Point<T>{ ... }

然后有

class IntPoint : Point<int>, IDoable<int> { ... }
class DoublePoint : Point<double>, IDoable<Double> { ... }
于 2013-09-04T09:39:36.333 回答
1

第一:
你的接口定义不正确。DoSomething不应有自己的通用参数。
它应该如下所示:

interface IDoable<T>
{
    void DoSomething(T p) ;
}

第二:
.NET 中没有接口、通用基类或其他可能允许泛型类使用某个运算符。
换句话说:您必须为每个要使用的数字类型创建一个类。
如果此实现的DoSomething方法应采用*Pointas 参数 - 根据您的问题 - 的实现int将如下所示:

class IntPoint : IDoable<IntPoint>
{ 
    public int x;
    public int y;
    public Point(int x, int y)
    {
        this.x = x;
        this.y = y;
    }

    public void DoSomething(IntPoint p)
    {
        p.x += 10;
        p.y += 10;
    }
}

您需要为等创建一个DoublePointdoubles

您可以通过创建一个抽象基类来稍微减少重复代码的数量,该基类具有一个用于算术运算的抽象方法,每个派生类都需要重写该方法。

于 2013-09-04T09:44:08.257 回答