2009-07-02 5 views
10

カスタムクラスを値型にキャストすることは可能ですか?C#:値型へのカスタムキャスト

はここに例を示します

var x = new Foo(); 
var y = (int) x; //Does not compile 

は、上記を実現するために、それは可能ですか? Fooに何かをオーバーロードする必要がありますか?

+0

どうすればいいですか? I.o.w、Fooの外観はどうですか? –

答えて

23

キャスト演算子をオーバーロードする必要があります。

public class Foo 
    { 
     public Foo(double d) 
     { 
      this.X = d; 
     } 

     public double X 
     { 
      get; 
      private set; 
     } 


     public static implicit operator Foo(double d) 
     { 
      return new Foo (d); 
     } 

     public static explicit operator double(Foo f) 
     { 
      return f.X; 
     } 

    } 
+0

答えに暗黙的および明示的な使用を説明してください。ありがとう。 –

+0

Plz MSDNを参照してください。 http://msdn.microsoft.com/en-us/library/xhbhezf4(VS.80).aspx http://msdn.microsoft.com/en-us/library/z5z9kes2(VS .71).aspx (私はいつも明示的なキャスト演算子を好むでしょう) –

+1

優れた、まさに私が答えで探していたもの。乾杯。 –

6

明示的または暗黙的な変換を作成します。違いは、明示的な変換で、あなた自身をキャストタイプしなければならないだろう、ある

public class Foo 
{ 
    public static explicit operator int(Foo instance) 
    { 
     return 0; 
    } 

    public static implicit operator double(Foo instance) 
    { 
     return 0; 
    } 
} 

を:

int i = (int) new Foo(); 

と暗黙的な変換とし、あなたは物事を「割り当てる」ことができます:

double d = new Foo(); 

"不要なキャストを排除することで、暗黙の変換によってソースコードの可読性が向上する可能性があります。ただし、暗黙的な変換では、プログラマがあるタイプから別のタイプに明示的にキャストする必要がないため、予期しない結果が発生しないように注意する必要があります。 一般に、暗黙的な変換演算子は、例外をスローして情報を失うことはありません。そのため、プログラマの認識がなくても安全に使用できます。変換演算子がこれらの条件を満たすことができない場合は、明示的にマークする必要があります。」(強調鉱山)

0

別の可能性は、あなたのクラスの解析とTryParse拡張メソッドを書くことです

次のようにあなたは、あなたのコードを記述します。

var x = new Foo(); 
var y = int.Parse(x); 
+2

なぜあなたは通常のメンバーメソッドではなく、拡張メソッドとして記述しますか?彼のクラスなので、彼はそれを支配する。 –

+2

ハンマーを持っていると、すべての問題は爪です。 –

+1

@マーク:もしあなたが拡張メソッドを書いたとしても、それを "var y = int.Parse(x);"で使うことはできませんでした。拡張メソッドはインスタンスにのみ適用されるためです。あなたは "var y = x.ParseToInt();"のような何かをしなければならないでしょう代わりに、その場合、なぜParseToIntメソッドをクラスそのものに置くのではなく、なぜFrederikが言うように。 – LukeH

5

あなたが定義する必要がありますexplicitまたはimplicitキャスト:

public class Foo 
{ 
    public static implicit operator int(Foo d) 
    { 
     return d.SomeIntProperty; 
    } 

    // ... 
関連する問題