将通用指针传递给c#中的方法

And*_*rew 2 c# generics pointers

我创建了一个泛型类型作为指针,以便我可以通过引用传递.(也许有一种更简单的方法可以做到这一点,但我想强调,我这样做是为了更多地了解泛型和通过引用传递,而不是完成任务的最有效方法,如果这是有道理的.)

这是我为泛型类型编写的代码

class GenericPointer<T> {
    public T item;
    public void setItem(T i){ item = i; }
    public T getItem(){ return item; }
}
Run Code Online (Sandbox Code Playgroud)

在我的程序中,我创建了一个名为'intPointer'的这种类型的实例.值143是任意的.

GenericPointer<int> intPointer = new GenericPointer<int>();
intPointer.setItem(143);
Console.WriteLine(intPointer.getItem());
Run Code Online (Sandbox Code Playgroud)

上面的代码运行正常,设置并返回值143.

我现在想将这个'intPointer'传递给一个递增它的方法,然后再次打印该值.

所以我写了一个名为addone()的方法

public void addone(int i) { i ++; }
Run Code Online (Sandbox Code Playgroud)

现在我想进行以下调用(记住我已经将值设置为143):

Console.WriteLine(intPointer.getItem());
addone(intPointer);
Console.WriteLine(intPointer.getItem());
Run Code Online (Sandbox Code Playgroud)

我期待看到的是143然后144然而我得到以下错误:

The best overloaded method match for 'Notes.Program.addone(int)' has some invalid arguments
Run Code Online (Sandbox Code Playgroud)

和:

cannot convert from 'Notes.GenericPointer<int>' to 'int'
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激!

Dai*_*Dai 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++;
}
Run Code Online (Sandbox Code Playgroud)

我还有一些其他说明:

  1. C#和.NET约定规定所有公共成员(方法,属性,字段等)都应该有TitleCase,而不是camelCase(即确保首字母大写).
  2. 不鼓励使用琐碎的getter和setter方法,而是使用Properties(尽管我注意到你不能使用ref带属性的参数).
  3. 你得到的错误是因为类型intPointer不是int,而是你的班级GenericPointer<int>.