2017年8月8日

型別轉換


public class C
{
    public T Data;
}

public class C : C
{
}

public C c1;
public C c2;

上面的c1無法轉換成c2,但我就是有這種需求…可能是我設計的不好 … 
我的Interface中訂了 C Query(string str);
在各個實作介面的物件中,回傳是各種C ,C等等…
因為要統一在外面接到就直接把C轉成Json字串,
所以需要C能正常轉型成C。

最後是在C裡面實做implicit(隱含轉換)


public class C
{
    public T Data;

    public static implicit operator C ( C cc )
    {
        var obj   = new C ();

        obj.Data  = cc.Data;

        return obj;
    }
}

這樣c2 = c1;的時候就不會出錯了!

隱含轉換的準則:
  1. 不會拋出例外
  2. 不會遺失資訊
所以其他程式設計人員可以不用注意這個東西直接拿來使用。

相對來說,如果希望其他程式設計人員在做轉型時可以注意到會有差異,希望他有認知到有做轉型的動作,
那實做的implicit關鍵字要改成explicit這樣在轉換的時候必須加上轉型關鍵字,寫成

c2 = (C)c1;

沒有留言: