2011-08-04 8 views
7

私は、IsolatedStorageにデータを書き込むために使用したジェネリッククラスを持っています。C#暗黙的な汎用クラスの変換を作成しますか?

私は、ジェネリックパラメータT

例えばに私のジェネリッククラスから変換するにはstatic implicit operator T()を使用することができます

MyClass<double> foo = new MyClass(187.0); 

double t = foo; 

私の質問は、どうやって逆にすることができますか?

MyClass<double> foo = new MyClass(187.0); 
double t = 0.2d; 
foo = t; 

暗黙の演算子は、静的である必要がありますので、私は、私は私のクラスのインスタンスを渡すことができますかわかりませんか?

+1

第2の暗黙的演算子はどのように定義していますか?それは最初の鏡像のように見えるはずです(反転した形で)。それは動作しませんか? –

+0

これはうまくいきましたが、新しいオブジェクトを作成する代わりに、クラスメソッドを使用したいと考えていました。 – Alan

+1

しかし、ええ、そのように動作しません。型変換は常に型の新しいインスタンスを生成します。 (実際は、これらのタイプは不変でなければなりません) –

答えて

7

EDIT:

あなたのクラスでTの値を変更できるようにしたい場合は、私のようなプロパティとして公開推薦する:あなたが変更することができます

T Value { get; set; } 

クラスの完全に新しいインスタンスを返す暗黙の演算子の動作ではなく、値を使用します。


暗黙の演算子を使用できます。使用できません。

public static implicit operator int(MyType m) 
public static implicit operator MyType(int m) 

ような何かを行うことは暗黙のうちにそれぞれMyTypeからintへとintからMyTypeに変換されます。しかし、あなたは正しいので、静的なので、intMyTypeは具体的にはMyTypeの新しいインスタンスを作成して返す必要があります。

このコードので:

MyClass<double> foo = new MyClass(187.0); 
double t = 0.2d; 
foo = t; 

tfooの値を交換しないだろう、暗黙のオペレータがtから全く新しいMyClassを返し、Fooにそれを割り当てます。

+0

あなたの編集には、私はそれを今日やっています。私はちょうど '.Value'をどこにも使用しない方がより滑らかになると思っていました。 – Alan

+2

私はどこでも '.Value'を使用します。それはあなたのコードをきれいにし、より読みやすくします。暗黙の演算子は便利ですが、過度に使用するとコードを読みにくくする可能性があります。あなたは正しい方法でやっています。 –

1

あなたは、単に別の暗黙の演算子を指定することによって、他の方法で変換することができなければならない:

public static implicit operator MyClass<T>(T input) 
{ 
    return new MyClass<T>(input); 
} 
10

このクラスは、TとMyClassの、両方の方法の間の変換を示しています。

class MyClass<T> 
{ 
    public MyClass(T val) 
    { 
    Value = val; 
    } 

    public T Value { get; set; } 

    public static implicit operator MyClass<T>(T someValue) 
    { 
    return new MyClass<T>(someValue); 
    } 

    public static implicit operator T(MyClass<T> myClassInstance) 
    { 
    return myClassInstance.Value; 
    } 
} 
+0

http://stackoverflow.com/questions/39618845/implicit-operator-with-generic-not-working-for-interfaceに関する追加の質問を参照してください。 –

関連する問題