【发布时间】:2014-08-20 06:36:54
【问题描述】:
我有一个班级Gen<T>,我希望能够比较它们。以下代码无法编译,因为 == 不能应用于 Parent 和 Child。有没有办法使这种比较成为可能,或者这种做法通常是不好的做法?
public class Parent{
public int x;
}
public class Child:Parent{}
public class Gen<T>
where T : Parent
{
public T variable;
}
public static class Gen
{
public static bool operator ==(Gen<Parent> left, Gen<Parent> right){
if (left.variable.x == right.variable.x)
return true;
else
return false;
}
}
public void Test()
{
Gen<Parent> foo = new Gen<Parent>();
Gen<Child> bar = new Gen<Child>();
if (foo == bar)
{
...
}
}
完整的上下文如下:
-
Gen<T>等于ColorSet<T>其中 T:Color - 父级等于颜色
- Child 是一个存储颜色附加信息的类,并非每个 Color 对象都需要这些信息。
我想通过ColorSet<T> 类访问每个Color,如下所示:
public class ColorSet<T> where T : Color
{
private T blue;
private T red;
private T green;
public ColorSet()
{
Red = (T)Activator.CreateInstance(typeof(T), new object[] { });
Red.Name = Values.Res.get("red");
Blue = (T)Activator.CreateInstance(typeof(T), new object[] { });
Blue.Name = Values.Res.get("blue");
Green = (T)Activator.CreateInstance(typeof(T), new object[] { });
Green.Name = Values.Res.get("green");
}
}
但有时我需要ColorSet<Color> 有时需要ColorSet<Child> 以获取更多信息。并且应该可以将ColorSet<Color> 与ColorSet<Child> 进行比较,因为它们具有最相关的共同信息。
【问题讨论】:
-
我不知道有什么办法——运算符本身不能是通用的——但我也不记得曾经想做这样的事情。老实说,我会写一个简单的方法。
-
@JonSkeet 你的意思是这样的方法: public static bool compare(Gen
one, Gen two){...} -
是的,尽管遵循正常的命名约定。或使其成为扩展方法。或者使它成为
Gen<T>中的实例方法。但即使有了所有这些,这仍然是一件有点奇怪的事情——比较两种不同类型的值是否相等并不是一个好主意。这里的真实背景是什么? -
@JonSkeet 感谢您的回复。我会考虑你的建议。我编辑了问题并解释了完整的上下文。如果您需要更多信息,请告诉我。
-
在这种情况下,我可能会在
ColorSet中添加类似ColorEquals的内容,并仔细记录它只是比较它们的基本Color值。然后该方法可以是通用的,接受ColorSet<TOther>。
标签: c# generics inheritance operator-keyword