Tôi có struct này:Strange hành vi hành chuyển đổi
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;
}
}
Và tôi đã đặt breakpoint như được chỉ ra bởi các ý kiến trên.
Sau đó, tôi làm điều này:
var first = new MyValue("first", "second");
if (first == (MyValue) null) throw new InvalidOperationException();
Tôi đang quan sát một số hành vi kỳ lạ khi nó đi vào if (first == (MyValue) null)
: breakpoint thứ hai là hit đối với một số lý do. Tại sao nó cố chuyển đổi MyValue
thành chuỗi để so sánh bình đẳng đơn giản? Sau đó, nếu tôi để mã tiếp tục, nó sẽ chạm vào điểm ngắt đầu tiên, và bây giờ tôi tự hỏi tại sao nó lại cố gắng chuyển đổi một chuỗi (giá trị là null
mặc dù thực tế là tôi đã đúc một cách rõ ràng null
vào một MyValue
) vào một số MyValue
? Các chuỗi không nên tham gia khi sử dụng câu lệnh như if (first == (MyValue) null)
, vậy điều gì thực sự xảy ra ở đây?
mà trong số hai toán tử ngầm mà bạn mong đợi được gọi khi bạn cung cấp 'null'? – Igor
Không, bởi vì tôi "không" chuyển đổi bất cứ điều gì. Nhưng dường như tôi. Do đó câu hỏi của tôi. –
Có thể nó có liên quan đến tình trạng quá tải bị mất đối với toán tử '=='. –