2012-11-07 43 views
2

可能重複:
C# Implicit/Explicit Type Conversion是否可以將整數加框到自定義類型對象?

我有我試圖框,這樣才能在一個構造函數,需要爲CustomType一個參數對象使用一個int。

我的意思是一個例子。

int x = 5; 
object a = x; 

CustomType test = new CustomType(a) 

//constructor in question 
public CustomType(CustomType a) 
{ 
    //set some variables etc 
} 

Howver我收到以下錯誤

The best overloaded method match for X has some invalid arguments. 

所以,很顯然我是沒譜的方式。我哪裏錯了?拳擊是正確的解決方案,或者我應該看類型鑄造?

+0

你打算如何使用這個'CustomType'? – climbage

+0

您的錯誤似乎與您提供的代碼不符。無論是這個還是你提供的例子都不符合標準。你能舉一個你想要做的更完整的例子嗎? –

+0

K;退後一步...你想做什麼?如果你想傳遞一個整數給構造函數,整數參數就可以了。, –

回答

2

該構造函數將CustomType類型作爲參數;你傳遞給它一個intint不是CustomType,並且C#語言知道從intCustomType沒有隱式轉換。這就是爲什麼你會收到錯誤。

int投射到object並沒有改變它仍然不是CustomType的事實。

看着那個特殊的構造函數,它是一個拷貝構造函數。它以一種自身作爲參數。有(可能會希望)另一個構造函數接受另一個參數,不管這是一個int還是其他類型,或者沒有提到,或者可能沒有參數,並且您需要在創建默認對象後設置屬性。

至於實際的解決方案,還有很多。這裏有幾個:

  1. 添加一個額外的構造函數到CustomType接受int
  2. 定義將int作爲參數並返回CustomObject的函數;這將是您可以使用的「轉換」功能。
  3. 使用的CustomType一個默認的構造函數,並設置你的整數屬性(可能會或可能不適用,這取決於CustomType一樣。

拳擊似乎並不在手,涉及到的問題。這不是你應該用來傳遞一個整數到一個自定義類型。如果你想知道更多關於拳擊是什麼,它是如何工作的,或者什麼時候有用,那麼考慮詢問一個能夠解決這些問題的問題,因爲這個問題通過使用拳擊作爲解決方案損害,沒有幫助。

2

我不認爲拳擊或鑄造是你在找什麼。如果你想爲一個整數傳遞到你的構造函數,構造函數應該被定義是這樣的:

public CustomType(int a) { 
} 

或者,如果你希望它是一個對象。

public CustomType(object a) { 
} 
0

您應該使用顯式類型轉換併爲其實現一些運算符。

2

您的構造函數看起來像複製構造函數(複製對象)。

,如果你想一個對象變量傳遞給你的CustomType構造函數,那麼語法必須是:

public CustomType(Object a) 
{ 
    //Unboxing 
    int value = (int) a; 
} 
+2

如果你只是將它轉換爲int類型,爲什麼不首先接受'int'參數呢? – Servy

+0

作爲一名學生,我們在課堂上看到拳擊和拆箱的原則。 有時候我們可以通過練習來理解這些原則。所以我猜他的問題是理解理論而不是以這種方式進行編程的問題。 –

+1

然而,這個代碼沒有顯示任何關於拳擊的原則,拳擊在問題中似乎也沒有真正相關,只是OP認爲是相關但不是。無論如何,你至少應該表明這是一個非常笨的代碼示例,以演示......某些事情(並解釋它演示的內容),而不是提出它,好像它是某人真正在實際應用程序中使用的解決方案。 – Servy

0

使用泛型。

public CustomType<T>(T a) 
{ 
//set some variables etc 
} 
0

您可以框intobject但不爲任意類型,你不能拿東西出來,是不是在盒子的開箱。即int i = (int)(object)5;將工作,但CustomType x = (CustomType)(object)5;將無法​​正常工作。

您將需要一個構造函數接受一個int

public CustomType(int a) { 
    .... 
} 

順便說一句,你創造了奇怪的遞歸。如果只有構造函數需要一個CustomType,那麼你需要另一個CustomType對象的第一個

初始化
CustomType ct = new CustomType(new CustomType(new CustomType(null))); 
+0

你認爲這是唯一的構造函數。好處是要麼完全需要其他東西,要麼只是幾個構造函數之一。也可以有一個派生自'CustomType'的類,並提供另一個可以傳遞給'CustomType'的構造函數來創建它,但那隻會......尷尬(然後就是'null',就像你顯示)。 – Servy

0

拳擊是當你轉換值類型(的值)會發生什麼或者

  1. 直接或間接基類(在int的情況下可以是ValueType類或object
  2. 值類型實現的接口(在int的情況下可以是ei療法IComparableIFormattableIConvertibleIComparable<int>,或IEquatable<int>

既然你也沒辦法讓int有其他基類或實現更多的接口,它不可能框中intCustomType

如果你寫你自己的struct然後決定什麼接口它實現,並在struct的這種情況下,值可以盒裝到每個這些接口類型。 (你不能改變一個struct的基類,雖然)。

內,您的類/結構CustomType可以定義從intimplicit conversionCustomType。通過這種方式,可以說這是合法的

CustomType ct = 5; 

但它不是拳擊。這只是對您的implicit operator方法的「不可見」呼叫。原始物品5未放入箱子;它只是您的操作員方法的參數。

相關問題