C#暗黙的に変換や==演算子
-
23-08-2019 - |
質問
一部コードコンテクスト:
class a
{
}
class b
{
public a a{get;set;}
public static implicit operator a(b b)
{
return b.a;
}
}
a a=null;
b b=null;
a = b;
//compiler: cannot apply operator '==' to operands of type tralala...
bool c = a == b;
利用は可能で==演算子の異なる型のインスタンスが暗黙的に変換ではありませんか?ったから見逃せないぞ!
編集:
の場合の種類と同じでなければなら呼び出し==その理由
int a=1;
double b=1;
bool c=a==b;
ですか?
解決
implicit
演算子は、唯一の割り当てのために働きます。
あなたのような、平等(==
)演算子をオーバーロードしたいです
class a
{
public static bool operator ==(a x, b y)
{
return x == y.a;
}
public static bool operator !=(a x, b y)
{
return !(x == y);
}
}
class b
{
public a a{get;set;}
public static implicit operator a(b b)
{
return b.a;
}
}
これは、あなたの記事で示唆したように、あなたがタイプa
とb
の2つのオブジェクトを比較できるようにする必要があります。
var x = new a();
var y = new b();
bool c = (x == y); // compiles
注:
私は、コンパイラが警告するよう単に、GetHashCode
とEquals
メソッドをオーバーライドrecommmend、しかし、あなたがそれらをSUPRESSしたいように見えるように、あなたは次のようにそれを行うことができます。
にa
のあなたのクラス宣言を変更します:
#pragma warning disable 0660, 0661
class a
#pragma warning restore 0660, 0661
{
// ...
}
他のヒント
利用は可能で==演算子 異なる型のインスタンスが では暗黙的に変換ではありませんか?
そうです。
ったから見逃せないぞ!
ここで、該当部分の仕様となっています。かを確認してください。
定義済みの参照型の平等 事業者が必要とうてい〔両方のオペランド 参照型の値の リテラルはnullになります。さらに、 標準 暗黙変換が存在するから タイプのいずれかのオペランドの種類 その他のオペランド.
ユーザ定義の変換を定義しない標準に変換します。これらの参照。そのため、定義済みの参照型の平等のオペレーターはありません。
の場合の種類と同じでなければなら呼び出し==, そ【ダブルル==int]ですか?
ご想像するのと同じでなければならが間違っています。が標準暗黙的に変換からintへのダブルが平等のオペレーターとキングです。
思いますのも見逃このビット:
でコンパイル時にエラーの使用 定義済みの参照型の平等 事業者の比較。 られることがわかっている異なるで コンパイルします。例えば、 コンパイル時の型のオペランド 二つのクラスの種類AとBが、 ってなくてはならないものも億ら その他、こ 二つのオペランドへの参照と同じ オブジェクトです。これにより、運転が とされるコンパイル時にエラーとなります。
私はあなたが実際にあなたが興味を持っているタイプのための==演算子をオーバーライドする必要があることを想像するだろう。型は暗黙的に変換可能で、あなたが使って実験する必要があります何かである場合でも、コンパイル/実行時はまだ文句を言うだろうかどうか。
public static bool operator ==(a a, b b)
{
//Need this check or we can't do obj == null in our Equals implementation
if (((Object)a) == null)
{
return false;
}
else
{
return a.Equals(b);
}
}
は、代わりにちょうど示唆し、実装が必要な型キャストをしていることを確認しole6kaのような実装をEqualsを使用します。
http://msdn.microsoft.com/en-us/library /8edha89s.aspxする
それぞれの場合において、1つのパラメータがなければなりません クラスまたは構造体と同じタイプ それは、演算子を宣言し(...)
この
を使用します bool c = a.Equals(b);