我目前有一个用户定义的类型
class MyType {
double x;
double y;
double z;
//This class has operator overloading implemented
public static MyType operator + (double a,MyType b){
...
}
}
稍后我会有一个数组(object []),其中一些是double和一些MyType。我想对它们进行评估,但编译器不允许将运算符'+'应用于类型对象和对象。我该怎么办?
答案 0 :(得分:2)
老实说,我会创建一个MyType
构造函数,它使用一个double
参数,并使用它将每个double
转换为MyType
,这样你就可以使用MyType[]
(或List<MyType>
)。
我知道这不是你要求的,但是你仍然能够处理MyType
创建,这样添加才能正常运行,并且你的数组更加类型安全
答案 1 :(得分:2)
在代码中解析+
时,编译器需要将其绑定到特定操作。类型object
没有+
操作,编译器不知道底层类型是double
和MyType
,因此编译器出错。
为了解决此问题,您需要
double
和MyType
,以便编译器可以正确绑定+
运算符dynamic
并依赖运行时绑定到正确的operator+
。 以下是后一种方法的示例。
class MyType {
double _value;
internal MyType(double value) {
_value = value;
}
public static MyType operator +(double left, MyType right) {
return new MyType(left + right._value);
}
public static MyType operator +(MyType left, double right) {
return new MyType(left._value + right);
}
public static MyType operator +(MyType left, MyType right) {
return new MyType(left._value + right._value);
}
public static implicit operator MyType(double other) {
return new MyType(other);
}
}
class Program
{
static void Main(string[] args) {
object[] them = new object[] {
42,
new MyType(13),
12,
new MyType(12)
};
dynamic all = them;
MyType sum = 0;
foreach (dynamic element in all) {
sum += element;
}
Console.WriteLine(sum);
}
}
答案 2 :(得分:0)
您应该更具体地说明您的类型 - 您无法添加的原因是因为对象可能在系统中任意。
是否有任何方法可以更改特定类型的对象?
如果绝对必须是对象,那么你必须在运行时使用强制转换或as运算符或类似的机制进行评估。
例如
public static MyType operator +(object o, MyType b)
{
MyOtherType mot = o as MyOtherType;
if(o!=null)
...
但毫无疑问,您的解决方案会引发有关您的设计选择的问题