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
float
PointF
PointF