演算子のオーバーロード、特に暗黙的および明示的な変換では、数値型と予期しない結果を持つ明示的および暗黙的演算子
しかし、私は頻繁に使用されるいくつかの数値パラメータを持っているので、これらのパラメータを強く入力する数値型のラッパーとして構造体を作成しています。ここでの実装例を示します:
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);
}
}
私は明示的および暗黙の演算子のこつを得るために、私のテスト実装を試してたので、私は明示的に私のParameter
型にし、それがスローされませんでした私は驚きにInt64
をキャストしてみました例外、さらには驚くべきことに、数字を切り捨てて移動しました。私はカスタムの明示的な演算子を除外しようとし、それは同じように動作しました。
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
と私の実験を繰り返し、同じ正確な動作を持っているので、明らかにこれは期待される動作ですが、私は、データの失うことになる明示的なキャストが投げるだろうと思いました例外。
いいえ、明示的なキャストが情報を失うことができます。暗黙的なキャストは行わないでください。 –
'AnyCPU'、' x32'、 'x64'でコンパイルしていますか? – ja72
@ ja72回答が遅れて申し訳ありませんが、x86でコンパイルしています。 – psubsee2003