我有一个库,我试图从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>
?对于库的用户来说,这似乎既低效又不必要地复杂/丑陋。我真的很想听到一些惯用且更优雅的可行替代方案。
答案 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>
等等。有点乏味,但它会完成工作。