[แก้ไข: ทำให้คำเตือนเป็นข้อผิดพลาดและทำให้ตัวดำเนินการมีความชัดเจนเกี่ยวกับ nullable แทนที่จะเป็นสตริงแฮ็ค]
ตามข้อเสนอแนะที่ชาญฉลาดของ @ supercat ในความคิดเห็นด้านบนตัวดำเนินการต่อไปนี้โอเวอร์โหลดช่วยให้คุณสร้างข้อผิดพลาดเกี่ยวกับการเปรียบเทียบประเภทค่าที่กำหนดเองของคุณเป็นค่าว่าง
ด้วยการใช้ตัวดำเนินการที่เปรียบเทียบกับเวอร์ชันที่เป็นโมฆะของประเภทของคุณการใช้ null ในการเปรียบเทียบจะตรงกับตัวดำเนินการเวอร์ชันที่เป็นโมฆะซึ่งช่วยให้คุณสร้างข้อผิดพลาดผ่านทางแอตทริบิวต์ล้าสมัย
จนกว่า Microsoft จะเตือนเรากลับคอมไพเลอร์ของเราฉันจะใช้วิธีแก้ปัญหานี้ขอบคุณ @supercat!
public struct Foo
{
private readonly int x;
public Foo(int x)
{
this.x = x;
}
public override string ToString()
{
return string.Format("Foo {{x={0}}}", x);
}
public override int GetHashCode()
{
return x.GetHashCode();
}
public override bool Equals(Object obj)
{
return x.Equals(obj);
}
public static bool operator ==(Foo a, Foo b)
{
return a.x == b.x;
}
public static bool operator !=(Foo a, Foo b)
{
return a.x != b.x;
}
[Obsolete("The result of the expression is always 'false' since a value of type 'Foo' is never equal to 'null'", true)]
public static bool operator ==(Foo a, Foo? b)
{
return false;
}
[Obsolete("The result of the expression is always 'true' since a value of type 'Foo' is never equal to 'null'", true)]
public static bool operator !=(Foo a, Foo? b)
{
return true;
}
[Obsolete("The result of the expression is always 'false' since a value of type 'Foo' is never equal to 'null'", true)]
public static bool operator ==(Foo? a, Foo b)
{
return false;
}
[Obsolete("The result of the expression is always 'true' since a value of type 'Foo' is never equal to 'null'", true)]
public static bool operator !=(Foo? a, Foo b)
{
return true;
}
}
if (1 == 2)
เช่นกัน ไม่ใช่หน้าที่ของคอมไพเลอร์ในการวิเคราะห์เส้นทางรหัส นั่นคือเครื่องมือวิเคราะห์แบบคงที่และการทดสอบหน่วย