public static implicit operator
自分用
たとえば
public class IntHolder { public int Value {private set;get;} public static implicit operator IntHolder(int value) { return new IntHolder() {Value = value}; } }
こんなクラスを作ると
public void Main() { IntHolder holder = 100; //この=での代入式がstatic implicit operatorの中身にすりかえられる var data = holder.Value;//100がdataに入る }
すなわち、ただのintを代入しているようで、実は内部ではIntHolderのインスタンス化が走る。
public void Main() { IntHolder holder = new IntHolder() {Value = 100}; var data = holder.Value; }
をやっているようなものだけれど、Value
はprivate setなのでもちろんこんなことはできない。
さらにGenericsを使ったりすると
public class ValueHolder<T> { public T Value { private set; get; } public static implicit operator ValueHolder<T>(T value) { return new ValueHolder<T>() {Value = value}; } }
public void Main() { ValueHolder<int> holder1 = 100; ValueHolder<string> holder2 = "ほげほげ"; var data1 = holder1.Value; //100が入ってる var data2 = holder2.Value; //"ほげほげ"が入ってる }
こんなことが出来たりする。 (たぶんNullableとかも同じような感じになっているはず。)
しかし、これだと、<int>や<string>など、右辺から推測できそうな型の推論が出来ないので、さらにこんなクラスも用意してあげる
public static class ValueHolder { public static ValueHolder<T> Create<T>(T value) { return value; //この時点でValueHolder<T>への代入扱いになるので、implicit operator ValueHolder<T>が走る } }
public void Main() { //ValueHolder<int> holder1 = 100; //ValueHolder<string> holder2 = "ほげほげ"; var holder1 = ValueHolder.Create(100); var holder2 = ValueHolder.Create("ほげほげ"); var data1 = holder1.Value; //100が入ってる var data2 = holder2.Value; //"ほげほげ"が入ってる }
意味があるかないかでいうとない。