对于 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);的事情吗?对于库的用户来说,这似乎效率低下且不必要的复杂/丑陋。我真的很想听到一些可行的替代方案,这些替代方案是惯用的和更优雅的。

对于 c# 中缺少赋值运算符重载,是否有任何解决方法

为什么不重载数学运算符呢?

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

等等。有点乏味,但它会完成工作。