なんだかんだでプログラムが好き

私 すずきかつーき が主にプログラムに関する事を書いたり書かなかったりします

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;  //"ほげほげ"が入ってる
        }

意味があるかないかでいうとない。