7

更新:我找到了答案,如果没有其他人这样做,我将在几天内发布。


我正在创建一个数字结构,所以我重载了算术运算符。下面是一个表示 4 位无符号整数的结构示例:

public struct UInt4
{
    private readonly byte _value;

    private const byte MinValue = 0;
    private const byte MaxValue = 15;

    public UInt4(int value)
    {
        if (value < MinValue || value > MaxValue)
            throw new ArgumentOutOfRangeException("value");

        _value = (byte) value;
    }

    public static UInt4 operator +(UInt4 a, UInt4 b)
    {
        return new UInt4((a._value + b._value) & MaxValue);
    }
}

重载的加法运算符允许以下代码:

var x = new UInt4(10);
var y = new UInt4(11);
var z = x + y;

这里,计算溢出,所以变量 z 的值为5。但是,我也希望能够做到这一点:

var x = new UInt4(10);
var y = new UInt4(11);
var z = checked ( x + y );

此示例应引发 OverflowException。我怎样才能做到这一点?

我已经确定检查的上下文不会扩展到被调用的方法,因此,例如,无论是在检查的上下文还是未检查的上下文中调用它,它都不会抛出:

public static UInt4 operator +(UInt4 a, UInt4 b)
{
    int i = int.MaxValue;

    //this should throw in a checked context, but when
    //the operator is used in a checked context, this statement
    //is nonetheless unchecked.
    byte b = (byte)i;

    return new UInt4((a._value + b._value) & MaxValue);
}

有没有办法声明加法运算符的两个重载,一个已检查,另一个未检查?或者,有没有办法在运行时确定调用者的上下文(这似乎不太可能,但我想我还是会问),如下所示:

public static UInt4 operator +(UInt4 a, UInt4 b)
{
    byte result = (byte)(a._value + b._value);

    if (result > MaxValue)
        if (ContextIsChecked())
            throw new OverflowException();
        else
            result &= MaxValue;
     return new UInt4(result);
}

private static bool ContextIsChecked()
{
    throw new NotImplementedException("Please help.");
}
4

1 回答 1

3

根据 MSDNcheckedandunchecked关键字仅适用于整数类型。因此,您无法创建自己的类型来使用已检查和未检查的关键字。

于 2013-03-16T00:07:55.450 回答