对于 c# 中缺少赋值运算符重载,是否有任何解决方法
本文关键字:是否 任何 解决 方法 重载 赋值运算符 对于 | 更新日期: 2023-09-27 18:33:18
我有一个库,我正在尝试从c ++移植到c#。该库提供了一个类,该类应该是数字类型的直接替代品,以便无需大量重写代码即可使用它。这在 c++ 中是相当微不足道的,但我被困在 c# 中缺乏赋值运算符重载上。我想要一个类似这样的类或结构:
public struct Number<T>
{
private T value;
private int importantInteger;
public Number(T initialValue, int initialInteger = 0)
{
value = initialValue;
importantInteger = initialInteger;
}
public static implicit operator Number<T>(T initialValue)
{
return new Number<T> (initialValue);
}
public static implicit operator T(Number<T> number)
{
return number.value;
}
public override string ToString ()
{
return value.ToString() + " " + importantInteger.ToString();
}
}
但在更新时具有 importantInteger
值的持久内存。如果我这样做:
var n = new Number<int>(23, 5);
n = 3*n;
Console.WriteLine(n.ToString());
然后我可以看到importantInteger
等于 0,因为n = 3*n;
正在创建一个默认值为 importantInteger
的新Number<int>
对象。我希望现有对象仅value
更新,以便importantInteger
保持不变,但至少我希望将其复制到新对象中。
有没有办法远程完成这样的事情?我已经阅读了许多类似的问题,并且我很清楚我不能使赋值运算符过载。不过,有什么优雅的方法可以获得类似的行为吗?我真的需要让用户每次想要更新其值时都做类似n = Number<int>(3*n, n.importantInteger);
的事情吗?对于库的用户来说,这似乎效率低下且不必要的复杂/丑陋。我真的很想听到一些可行的替代方案,这些替代方案是惯用的和更优雅的。
为什么不重载数学运算符呢?
public static Number<T> operator*(Number<T> value, Number<T> otherValue)
{
//Do your operation on otherValue here so that it is what you want
return otherValue;
}
我不完全确定这里需要如何计算您的 importantInteger,但如果您还创建了一个隐式强制转换运算符供T
Number<T>
,这应该可以工作。
跟进您的评论。即使你不能在泛型上使用算术运算符,你也可以做这样的事情:
if(typeof(T) == typeof(int))
{
//cast values to ints and do the math.
}
else if(typeof(T) == typeof(double))
//do double version
等等。有点乏味,但它会完成工作。