そのままでMyClass x = 120;
、そのようなカスタムクラスを作成することは可能ですか? もしそうなら、どうすればそれを行うことができますか?
2655 次
4 に答える
5
一般に、暗黙の演算子を使用することは悪い考えと見なされています。結局のところ、それらは暗黙的であり、背後で実行されるからです。演算子のオーバーロードが散らばっているコードをデバッグするのは悪夢です。つまり、次のようなものです。
public class Complex
{
public int Real { get; set; }
public int Imaginary { get; set; }
public static implicit operator Complex(int value)
{
Complex x = new Complex();
x.Real = value;
return x;
}
}
あなたが使用することができます:
Complex complex = 10;
または、 + 演算子をオーバーロードすることもできます
public static Complex operator +(Complex cmp, int value)
{
Complex x = new Complex();
x.Real = cmp.Real + value;
x.Imaginary = cmp.Imaginary;
return x;
}
のようなコードを使用します
complex +=5;
于 2010-06-10T15:01:32.030 に答える
3
これがあなたが望むものかどうかはわかりませんが、暗黙の演算子を実装することでそこに到達するかもしれません: http://msdn.microsoft.com/en-us/library/z5z9kes2(VS.71).aspx
于 2010-06-10T14:52:14.647 に答える
3
暗黙の演算子を作成します。
http://msdn.microsoft.com/en-us/library/z5z9kes2.aspx
例えば:
public struct MyStruct // I assume this is what you meant, since you mention struct in your title, but use MyClass in your example.
{
public MyClass(int i) { val = i; }
public int val;
// ...other members
// User-defined conversion from MyStruct to double
public static implicit operator int(MyStruct i)
{
return i.val;
}
// User-defined conversion from double to Digit
public static implicit operator MyStruct(int i)
{
return new MyStruct(i);
}
}
「これでいいの?」議論の余地があります。暗黙的な変換は、プログラマーに受け入れられている標準を破る傾向があります。一般的には良い考えではありません。ただし、たとえば、大きな値のライブラリを実行している場合は、良い考えかもしれません。
于 2010-06-10T14:52:47.167 に答える
0
はい、ここに短い例があります...
public struct MyCustomInteger
{
private int val;
private bool isDef;
public bool HasValue { get { return isDef; } }
public int Value { return val; } }
private MyCustomInteger() { }
private MyCustomInteger(int intVal)
{ val = intVal; isDef = true; }
public static MyCustomInteger Make(int intVal)
{ return new MyCustomInteger(intVal); }
public static NullInt = new MyCustomInteger();
public static explicit operator int (MyCustomInteger val)
{ if (!HasValue) throw new ArgumentNullEception();
return Value; }
public static implicit operator MyCustomInteger (int val)
{ return new MyCustomInteger(val); }
}
于 2010-06-10T14:58:23.247 に答える