c#中是否缺少赋值运算符重载?

时间:2016-02-04 00:41:47

标签: c# operator-overloading assignment-operator

我有一个库,我试图从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

然后我可以看到n = 3*n;等于0,因为Number<int>正在创建一个新的importantInteger对象,其默认值为value。我希望现有对象只更新importantInteger,以便n = Number<int>(3*n, n.importantInteger);保持不变,但至少我希望将其复制到新对象。

有没有办法像这样远程完成任何事情?我已经阅读了很多类似的问题,而且我很清楚我无法使赋值运算符超载。有没有任何优雅的方式来获得类似的行为?我是否真的需要让用户每次想要更新它的值<select onchange="OnSelectionChange(this)"> <option value="1">one</option> <option value="2">two</option> <option value="3">three</option> <option value="4">four</option> </select> <ul class="icheck-list"> {foreach $rps as $rp} <li> <input type="checkbox" name="updatePERM[]" value="{$rp.id}"> <label for="minimal-checkbox-1-15">{$rp.rname}</label> </li> {/foreach} </ul> <script type="text/javascript"> function OnSelectionChange (select) { var selectedOption = select.options[select.selectedIndex]; var url = "./include/getPerms.php?key="+selectedOption.value+""; $.getJSON(url, function(data) { $.each(data.rules, function(i, rule) { $('input:checkbox[value="' + rule.id + '"]').attr('checked', true).iCheck({ checkboxClass: 'icheckbox_flat-pink', }); }); }); } </script> ?对于库的用户来说,这似乎既低效又不必要地复杂/丑陋。我真的很想听到一些惯用且更优雅的可行替代方案。

1 个答案:

答案 0 :(得分:1)

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

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>

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