私はこの構造体があります。奇妙な変換演算子の挙動
public struct MyValue
{
public string FirstPart { get; private set; }
public string SecondPart { get; private set; }
public static implicit operator MyValue(string fromInput)
{ // first breakpoint here.
var parts = fromInput.Split(new[] {'@'});
return new MyValue(parts[0], parts[1]);
}
public static implicit operator string(MyValue fromInput)
{ // second breakpoint here.
return fromInput.ToString();
}
public override string ToString()
{
return FirstPart + "@" + SecondPart;
}
public MyValue(string firstPart, string secondPart) : this()
{
this.FirstPart = firstPart;
this.SecondPart = secondPart;
}
}
をそして、上記のコメントで示されるように、私はブレークポイントを設定しました。
は、それから私はこれを行う:var first = new MyValue("first", "second");
if (first == (MyValue) null) throw new InvalidOperationException();
それはif (first == (MyValue) null)
に入ったとき、私はいくつかの奇妙な行動を観察しています:第二ブレークポイントが何らかの理由でヒットします。単純な等価比較のためにMyValue
を文字列に変換しようとしているのはなぜですか?私はコードを継続させる場合
そして、それは最初のブレークポイントにヒットし、今私はそれが文字列を変換しようとしている理由を思ったんだけど(値は、私は明示的にnull
を投げてきたという事実にもかかわらずnull
ですMyValue
)をMyValue
に変換します。 if (first == (MyValue) null)
のようなステートメントを使用するときは、文字列を使用しないでください。実際にここで何が起こっていますか?
2つの暗黙的な演算子のうち、 'null 'を指定するとどちらが呼び出されると思われますか? – Igor
どちらも、私は何も変換していないからです。しかし、私は明らかにそうです。したがって、私の質問です。 –
これは '=='演算子の欠落したオーバーロードと関係しているかもしれません。 –