使用LinqPad,很容易查看IL以查看發生了什麼。基本上,Point
轉換爲PointF
,然後PointF
調用==
等號方法。
例如,使用此代碼:
System.Drawing.PointF myPointF = new System.Drawing.PointF(1.1f ,1.1f);
System.Drawing.Point myPoint = new System.Drawing.Point(1,1);
bool equal = (myPointF == myPoint);
Console.WriteLine(equal);
產生如下IL:
IL_0001: ldloca.s 00 // myPointF
IL_0003: ldc.r4 CD CC 8C 3F
IL_0008: ldc.r4 CD CC 8C 3F
IL_000D: call System.Drawing.PointF..ctor
IL_0012: nop
IL_0013: ldloca.s 01 // myPoint
IL_0015: ldc.i4.1
IL_0016: ldc.i4.1
IL_0017: call System.Drawing.Point..ctor
IL_001C: nop
IL_001D: ldloc.0 // myPointF
IL_001E: ldloc.1 // myPoint
IL_001F: call System.Drawing.Point.op_Implicit //<- convert Point to PointF
IL_0024: call System.Drawing.PointF.op_Equality //<- PointF equality
IL_0029: stloc.2 // equal
IL_002A: ldloc.2 // equal
IL_002B: call System.Console.WriteLine
如果使用ILSpy,你可以找到既Point.op_Implicit
和PointF.op_Equality
的內容。
// System.Drawing.Point
public static implicit operator PointF(Point p)
{
return new PointF((float)p.X, (float)p.Y);
}
// System.Drawing.PointF
public static bool operator ==(PointF left, PointF right)
{
return left.X == right.X && left.Y == right.Y;
}
這表明int
值被轉換爲float
值時Point
轉換爲PointF
,然後從原始PointF
實例和轉換PointF
實例的float
值進行比較。
您是否嘗試過反向工程代碼? – nothrow
你認爲是正確的,任何隱含發生的轉換都不會涉及任何數據丟失,因此int轉換爲float – prthrokz
個人而言,我相信對文檔所說的實際測試的結果。 –