【发布时间】:2016-05-13 10:42:16
【问题描述】:
我有一个库,我正在尝试从 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); 的事情吗?对于图书馆的用户来说,这似乎既低效又不必要的复杂/丑陋。我真的很想听听一些可行的替代方案,它们是惯用的、更优雅的。
【问题讨论】:
-
您无法通过重载赋值运算符来解决这个问题。当您尝试分配值时,当您通过隐式运算符将对象转换为
int时,您尝试使用的整数已经丢失。解决问题的唯一方法是重载*运算符(或使用方法代替该运算符)。
标签: c# operator-overloading assignment-operator