2010-01-14 39 views
2

有點震驚地發現System.Drawing.PointF似乎有運營商減去大小但不是其他PointFs。所以我試圖編寫我自己的PointF類,但它需要能夠將System.Drawing.Points自動轉換爲它,或者它確實不會增加任何便利。所以我寫了這些構造函數:C#PointF減?

public PointF(float x = 0, float y = 0) 
    { 
     this.x = x; 
     this.y = y; 
    } 

    public PointF(System.Drawing.PointF p) : this(p.X, p.Y) { } 
    public PointF(System.Drawing.Point p) : this(p.X, p.Y) { } 

但我仍然收到此錯誤:

cannot convert from 'System.Drawing.Point' to 'my_namespace.PointF'

(我接受一個my_namespace.PointF但我傳遞一個System.Drawing.Point功能)。

不應該第三個構造函數踢入並自動轉換它嗎?

+0

你可能已經張貼的最後一節課。你可以嗎?我只是想要同樣的東西! :D – Pedro77 2012-04-20 12:42:53

回答

3

您是否在my_namespace.PointF類中定義了隱式轉換?它不會自動否則轉換。

public PointF(float x = 0, float y = 0) 
{ 
    this.x = x; 
    this.y = y; 
} 

public PointF(System.Drawing.PointF p) : this(p.X, p.Y) { } 
public PointF(System.Drawing.Point p) : this(p.X, p.Y) { } 

//add this: 
public static implicit operator PointF(System.Drawing.Point pt) 
{ return new PointF(pt); } 
+0

啊!我不知道這個「implict operator」。這就是我一直在尋找的!謝謝。 – mpen 2010-01-14 05:53:51

1

您是否考慮過編寫'擴展方法'而不是推出自己的類的選項?

您不能讓運算符通過extn超載本身。方法(在框架的下一個版本中提出)..但是你應該能夠使用稱爲Add()的同義方法來獲取和獲取。

+0

是的,我已經考慮過了,但不能爲運營商編寫擴展名。 – mpen 2010-01-14 05:26:48

+0

我剛纔編輯我的答案,然後纔看到您的評論:) - 請參閱上面的帖子。 – Gishu 2010-01-14 05:29:04

+0

當然...但我想要語法糖!此外,我將在後面需要這個新類,因爲我正在使用第二個庫,它也定義了它自己的Point類......這將以某種方式合併它們。 – mpen 2010-01-14 09:32:29

1

這編譯對我來說:

class PointF { 
float x; float y; 
public PointF(float x, float y) 
{ 
    this.x = x; 
    this.y = y; 
} 

public PointF(System.Drawing.PointF p) : this(p.X, p.Y) { } 
public PointF(System.Drawing.Point p) : this(p.X, p.Y) { } 

public static implicit operator PointF(System.Drawing.Point pt) { return new PointF(pt); } 
public static implicit operator PointF(System.Drawing.PointF pt) { return new PointF(pt); } 
} 
//.... 
static void test(pointf.PointF p) { 
} 
//.... 
test(new System.Drawing.PointF(1, 1));