2

参照渡しできるように、ポインターとして機能するジェネリック型を作成しました。(おそらくこれを行うにはもっと簡単な方法がありますが、それが理にかなっている場合、タスクを完了するための最も効率的な方法ではなく、ジェネリックと参照による受け渡しについてもっと学ぶためにこれを行っていることを強調したいと思います。)

これが私がジェネリックタイプのために書いたコードです

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'

どんな助けでも大歓迎です!

4

3 に答える 3

6

私はあなたの用語のいくつかを修正することから始めます:あなたはポインターを使用していません。C#はポインターをサポートしますが、unsafeキーワードを使用し、それらは実際のポインターです(のように、直接操作できる整数メモリアドレス)。作成したコードは、ボックス化されたオブジェクトの単なる例です。

Object.NETは、 ;にキャストすることにより、すでにボクシングをサポートしています。refただし、キーワードは「修正」しようとしている問題を解決するため、推奨も必要もありません。

キーワードを使用してref、値による代わりに参照によって渡される必要がある値型パラメーターを記述します。他のすべてのセマンティクスは、次のように同じままです。

void Foo() {
    int x = 123;
    Bar(ref x);
    Console.Write( x ); // prints "124".
}
void Bar(ref int x) {
    x++;
}

他にもいくつかメモがあります。

  1. C#および.NETの規則では、すべてのパブリックメンバー(メソッド、プロパティ、フィールドなど)にキャメルケースではなくTitleCaseを含める必要があります(つまり、最初の文字が大文字になっていることを確認してください)。
  2. 簡単なgetterメソッドとsetterメソッドは推奨されておらず、代わりにプロパティを使用しています(ただし、プロパティでref引数を使用することはできません)。
  3. intPointerタイプがではなくint、クラスであるため、エラーが発生しますGenericPointer<int>
于 2012-11-06T00:26:37.277 に答える
1

GenericPointerはintをラップしていますが、実際にはintではないため、intとして扱うことはできません。intであるプロパティがあります。

GenericPointerが文字列をラップした場合を想像してみてください。AddOneはそれに何をしますか。

クラスのプロパティを操作することはできますが、クラス全体をジェネリック型として扱うことはできません。

Generic Pointer引数を取り、それがintであるかどうかを検査し、それがintの場合は内部アイテムに追加する、AddOneメソッドを作成することは可能です。それは良い考えではないと確信しています。

このGenericPointerで実際に何を達成しようとしていますか?

于 2012-11-06T00:34:40.150 に答える
0

パラメータが値型(string、int、boolなど)の場合に参照されるようにする場合は、次のようにパラメータを作成します。

public void addone(ref int i)
{
    i++;
}

次に、次のようにメソッドを呼び出します。

addone(ref variableInt);

クラスを特定のタイプとして機能させる方法を確認するために、これを確認することもできます。

于 2012-11-06T00:28:41.207 に答える