C# 在c中向方法传递泛型指针#

C# 在c中向方法传递泛型指针#,c#,generics,pointers,C#,Generics,Pointers,我创建了一个泛型类型作为指针,这样我就可以通过引用进行传递。(也许有一种更简单的方法可以做到这一点,但我想强调的是,我这样做是为了更多地了解泛型和通过引用传递,而不是完成任务的最有效的方法,如果这有意义的话。) 下面是我为泛型类型编写的代码 class GenericPointer<T> { public T item; public void setItem(T i){ item = i; } public T getItem(){ return item;

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

下面是我为泛型类型编写的代码

class GenericPointer<T> {
    public T item;
    public void setItem(T i){ item = i; }
    public T getItem(){ return item; }
}
现在我想进行以下调用(记住我已经将值设置为143):

我期望看到的是143然后是144,但我得到以下错误:

The best overloaded method match for 'Notes.Program.addone(int)' has some invalid arguments
以及:

无法从“Notes.GenericPointer”转换为“int”

任何帮助都将不胜感激

首先,我要纠正您的一些术语:您没有使用指针。C#确实支持指针,但使用了
unsafe
关键字,它们是真正的指针(比如,可以直接操作的整数内存地址)。您编写的代码只是一个装箱对象的示例

.NET通过强制转换到
对象
,已经支持装箱;但是,不建议也不需要它,因为
ref
关键字可以解决您试图“修复”的问题

使用
ref
关键字描述应通过引用而不是通过值传递的值类型参数。所有其他语义保持不变,如下所示:

void Foo() {
    int x = 123;
    Bar(ref x);
    Console.Write( x ); // prints "124".
}
void Bar(ref int x) {
    x++;
}
我还有几点注意:

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

  • 如果希望参数是值类型(字符串、int、bool等)的引用,请将参数设置为:

    public void addone(ref int i)
    {
        i++;
    }
    
    然后调用该方法,如下所示:

    addone(ref variableInt);
    

    您还可以查看,以了解如何使类作为特定类型工作。

    当GenericPointer包装一个int时,它实际上不是一个int,因此不能将其视为一个int。它的属性是int

    想象一下,如果GenericPointer包装了一个字符串。你会怎么做呢

    可以对类的属性进行操作,但不能将整个类视为其泛型类型

    可以编写一个AddOne方法,该方法接受一个通用指针参数,然后检查它是否为int,如果它是int,则向内部项添加一个。我相信这不是一个好主意


    使用这个通用指针,您真正想要实现什么?

    我认为在调用Bar时需要使用
    ref
    ,因此:
    Bar(ref x)
    @Dai首先,感谢您对术语的澄清,我仍然得到了错误。除了现在它说它不能转换为'ref int'我误解了吗?所以我做了以下更改:“addone(ref intPointer);”和'public void addone(ref int i)'{'i++;''}'显然,我还没有弄明白如何将代码放入注释中。。总有一天我会解决的。我是说你应该完全摆脱你的
    GenericPointer
    类,改用
    refint
    。@Dai我明白了。谢谢你的帮助!我是根据你的建议来做的。这个问题太宽泛了……一个正确的答案需要对一大块C#进行完整的解释……为什么不简单地使用ref关键字呢?这也是一个很好的回答:@MiMo我想我已经对我的问题给出了非常具体的解释。这个网站是为了学习和解决问题。没有人强迫你读书或屈尊俯就。我不需要有人牵着我的手,只要往正确的方向推一下就行了。幸运的是,还有其他人愿意帮忙。如果你没有什么有用的话要说,那么帮别人一个忙,把你的评论留给自己。老实说,我只是在学习c#语言的过程中尝试一下。我理解你所说的关于它是泛型并试图执行加法的问题。我希望能够做的是传递值,让程序做出与我尝试将字符串传递给将尝试递增该字符串的方法时相同的反应。因为这是不可能的,显然我会得到一个错误。这可能吗?还是我到了这里?
    cannot convert from 'Notes.GenericPointer<int>' to 'int'
    
    void Foo() {
        int x = 123;
        Bar(ref x);
        Console.Write( x ); // prints "124".
    }
    void Bar(ref int x) {
        x++;
    }
    
    public void addone(ref int i)
    {
        i++;
    }
    
    addone(ref variableInt);