[英]Passing a generic pointer to a method in c#
我創建了一個通用類型來充當指針,以便可以通過引用傳遞。 (也許有一種更簡單的方法可以做到這一點,但我想強調,我這樣做是為了更多地了解泛型和通過引用傳遞,而不是完成任務的最有效方法,如果這是有道理的。)
這是我為泛型類型編寫的代碼
class GenericPointer<T> {
public T item;
public void setItem(T i){ item = i; }
public T getItem(){ return item; }
}
在我的程序中,我創建了一個名為“ intPointer”的實例。 值143是任意的。
GenericPointer<int> intPointer = new GenericPointer<int>();
intPointer.setItem(143);
Console.WriteLine(intPointer.getItem());
上面的代碼運行正常,設置並返回值143。
我現在想將這個'intPointer'傳遞給一個遞增它的方法,然后再次打印該值。
所以我寫了一個名為addone()的方法
public void addone(int i) { i ++; }
現在我想進行以下調用(記住我已經將值設置為143):
Console.WriteLine(intPointer.getItem());
addone(intPointer);
Console.WriteLine(intPointer.getItem());
我原本希望看到的是143,然后是144,但是出現以下錯誤:
The best overloaded method match for 'Notes.Program.addone(int)' has some invalid arguments
和:
cannot convert from 'Notes.GenericPointer<int>' to 'int'
任何幫助將不勝感激!
我將首先糾正你的一些術語:你沒有使用指針。 C#確實支持指針,但使用unsafe
關鍵字,它們是真正的指針(如在整數存儲器地址中,您可以直接操作)。 您編寫的代碼只是裝箱對象的示例。
.NET已經通過強制轉換為Object
來支持裝箱; 但是不推薦也不需要它,因為ref
關鍵字解決了你試圖“修復”的問題。
使用ref
關鍵字來描述應該按引用而不是按值傳遞的值類型參數。 所有其他語義保持不變,如下所示:
void Foo() {
int x = 123;
Bar(ref x);
Console.Write( x ); // prints "124".
}
void Bar(ref int x) {
x++;
}
我還有一些其他說明:
ref
參數與properties一起使用)。 intPointer
的類型不是int
,而是您的類GenericPointer<int>
。 雖然GenericPointer包裝了一個int,但它實際上並不是一個int,因此它不能被視為一個int。 它具有int的屬性。
想象一下,如果GenericPointer包裹了一個字符串。 AddOne會對此做些什么。
您可以對類的屬性執行操作,但不將整個類視為其泛型類型。
可以編寫一個采用通用指針參數的AddOne方法,然后檢查其是否為整型,如果內部值為int,則將其添加到內部項中。 我確信這不是一個好主意。
你真的想用這個GenericPointer實現什么?
如果您希望參數是值類型(字符串,整數,布爾值等)的引用,則使您的參數像這樣:
public void addone(ref int i)
{
i++;
}
然后像這樣調用方法:
addone(ref variableInt);
您還可以查看此內容 ,以了解如何使您的類作為特定類型工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.