我创建了一个泛型类型作为指针,以便我可以通过引用传递。 (也许有一种更简单的方法可以做到这一点,但我想强调,我这样做是为了更多地了解泛型和通过引用传递,而不是最有效的完成任务的方法,如果这是有道理的。)
这是我为泛型类型
编写的代码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'
非常感谢任何帮助!
答案 0 :(得分:6)
我首先要纠正你的一些术语:你没有使用指针。 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
参数与属性一起使用)。intPointer
的类型不是int
,而是您的班级GenericPointer<int>
。答案 1 :(得分:1)
虽然GenericPointer包装了一个int,但它实际上并不是一个int,所以它不能被视为一个int。它具有int的属性。
想象一下,如果GenericPointer包裹了一个字符串。 AddOne会做些什么。
您可以对类的属性进行操作,但不要将整个类视为其泛型类型。
可以编写一个AddOne方法,该方法接受Generic Pointer参数,然后检查它的intyness,然后在内部项中添加一个(如果它是int)。我相信这不是一个好主意。
你真的想用这个GenericPointer实现什么?
答案 2 :(得分:0)
如果你想让参数作为值类型(string,int,bool等)引用参数,那么就像这样制作你的参数:
public void addone(ref int i)
{
i++;
}
然后像这样调用方法:
addone(ref variableInt);
您还可以查看this,了解如何使您的课程成为特定类型。