У меня есть эта структура:
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)
, так что на самом деле происходит здесь?