平,
我一直在寻找但找不到合适的答案......也许指出了我。
所以我有一个接口和一个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,或者修改该值。 有什么想法吗?
答案 0 :(得分:2)
您正尝试将10(整数)添加到T
类型的值。 T
可以是整数,DateTime,List,或其他一些自定义类。这意味着绝对不能保证您的T
能够将自己添加到整数。
不幸的是,C#中没有办法添加generic type constraint,这会将参数限制为支持某种操作的类型。
有解决方法,但它们很难看。即你可以:
class Point<T>{ ... }
然后有
class IntPoint : Point<int>, IDoable<int> { ... }
class DoublePoint : Point<double>, IDoable<Double> { ... }
答案 1 :(得分:1)
第一:
您的界面定义不正确。 DoSomething
不应该有自己的通用参数
它应该是这样的:
interface IDoable<T>
{
void DoSomething(T p) ;
}
第二:
.NET中没有接口,公共基类或其他可能允许泛型类使用某个运算符的可能性
换句话说:您必须为每个要使用的数字类型创建一个类
如果此实现的DoSomething
方法应该以{{1}}作为参数 - 根据您的问题 - *Point
的实现将如下所示:
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;
}
}
创建一个类DoublePoint
,依此类推。
您可以通过使用抽象方法创建抽象基类来减少重复代码的数量,该算法操作需要被每个派生类覆盖。