我從來沒有對重載運算符做過任何廣泛的工作,特別是隱式和顯式轉換。帶數值類型和意外結果的顯式和隱式運算符
但是,我有幾個經常使用的數字參數,所以我創建一個結構作爲數字類型的包裝來強制輸入這些參數。下面是一個示例實現:
public struct Parameter
{
private Byte _value;
public Byte Value { get { return _value; } }
public Parameter(Byte value)
{
_value = value;
}
// other methods (GetHashCode, Equals, ToString, etc)
public static implicit operator Byte(Parameter value)
{
return value._value;
}
public static implicit operator Parameter(Byte value)
{
return new Parameter(value);
}
public static explicit operator Int16(Parameter value)
{
return value._value;
}
public static explicit operator Parameter(Int16 value)
{
return new Parameter((Byte)value);
}
}
,因爲我是用我的測試執行得到明確的和隱含的運營商的懸掛實驗,我想明確地蒙上了Int64
我Parameter
類型和我的驚訝它沒有扔一個例外,甚至更令人驚訝的是,它只是截斷了數字並繼續前進。我試圖排除自定義顯式運算符,它仍然表現相同。
public void TestCast()
{
try
{
var i = 12000000146;
var p = (Parameter)i;
var d = (Double)p;
Console.WriteLine(i); //Writes 12000000146
Console.WriteLine(p); //Writes 146
Console.WriteLine(d); //Writes 146
}
catch (Exception ex)
{
Console.WriteLine(ex.Message); //Code not reached
}
}
所以我重複我的實驗與普通Byte
代替我的結構,並具有完全相同的行爲,所以顯然這是預期的行爲,但我認爲有明確的轉換是導致數據丟失的將拋出一個例外。
沒有,顯式轉換可能會丟失信息。隱式轉換不應該。 – 2011-12-15 21:08:52
你是用`AnyCPU`,`x32`還是`x64`編譯? – ja72 2011-12-15 22:08:47
@ ja72對不起,我的回覆延遲了,但是我正在使用x86 – psubsee2003 2011-12-16 10:07:24