2017-12-18 22 views
0

暗黙のキャストをintからAにオーバーロードすると、操作の左側のインスタンスを取得する方法はありますか?暗黙的なキャスト演算子の左側の参照

このよう

public class A 
{ 
    int myInt; 
    public static implicit operator A(int x) 
    { 
     a.myInt = x; 
    } 
} 

、その後

A myA = new A(); 
myA = 2; 

myA.myInt2

あるように、私は、インターネット上で検索が、私はこの正確な問題に対する答えを見つけることができませんでした。静的関数なので可能ではないと思うし、関数に2つのパラメーターを入れようとするとエラーになる。また、NULL変数でこれをやろうとするとエラーが発生することがあります(このように宣言した場合はA myA;)。しかし、あなたは構造体でそれを行うことができます(なぜなら、構造体がnullになることができないこと、またはnullを割り当てることができないことを知っているからです)。

私はこの仕事のようなものを作るためにできる何らかの魔法があるかどうか疑問に思っています。

+0

それは私が行うときに "" 'MyDestType'への参照があるはずです(MyDestType)' myExpr'言うようなものです。しかし、キャストが発生する前にno__'MyDestType'があります。変換演算子の本体では、まずインスタンスをローカル変数として作成します。その後、必要に応じて修正することができます。最後にそれを返します。あなたが上に持っているものは、法的なC#ではありません。 –

+0

=演算子をオーバーロードするとどうなりますか?操作の左側を参照する方法はありますか? – ItsaMeTuni

+0

@ItsaMeTuniその演算子をオーバーロードすることはできません。 – Servy

答えて

4

いつもあるわけではないので、myA.myIntまたはその他の左側の参照は取得できません。

void Foo(A a) {...} 
... 
Foo(2); 

以上Foo(2)があなたの暗黙の型変換演算子を呼び出す必要が呼び出す、まだその戻り値はFooa以外に割り当てられていない。ここで

は左側が問題となる決定する場合の例でありますパラメータは、呼び出し元で使用可能な変数ではありません。

Demo.

3

これはできません。暗黙の演算子は値を返します。 C#コンパイラによって生成されたコードで、そのコードを呼び出して値を取得し、呼び出し元が使用する必要があることを示す方法で使用します。

であることもありません。保管場所はです。誰かがSomeMethodThatAcceptsAnAInstance(2)と書いた場合、暗黙の変換の結果を変数に格納していません。暗黙の演算子の値が設定されるまでaが初期化されていない変数であるA a = 2;を書くこともできます。その結果、暗黙の演算子が呼び出された時点で記憶場所が有効な状態になりません。

関連する問題