4

残念なことに、次のコードはコンパイルされません。

refただし、キーワードを削除するとコンパイルされます。

class xyz
{
    static void foo(ref object aaa)
    {
    }

    static void bar()
    {
        string bbb="";
        foo(ref bbb);
        //foo(ref (object)bbb); also doesnt work
    }
}
  1. 誰でもこれを説明できますか?私は、参照が派生クラスに対して非常に厳密であることと関係があると推測しています。

  2. 文字列型のオブジェクトを に渡す方法はありますfoo(ref object varname)か?

4

4 に答える 4

8

それは完全に一致する必要があります。それ以外の場合は次のようになりfooます。

aaa = 123;

fooこれは( を にボックス化しますint)には有効ですが、 ( である場合) には有効ではありobjectません。barstring

2 つの当面のオプション。まず、中間変数と型チェックを使用します。

object tmp = bbb;
foo(ref tmp);
bbb = (string)tmp;

または、ジェネリックを試してみてください ( foo<T>(ref T aaa)); またはbbbobject代わりに扱いstringます。

于 2011-06-16T12:22:51.533 に答える
5

いいえ、ありません。次のことを想像してください。

static void Foo(ref object obj)
{
    obj = new SomeObject();
}

static void Bar()
{
    string s = "";
    Foo(ref s);
}

SomeObjectFoo は、実際にはstring!である変数に a を代入しようとします。

于 2011-06-16T12:23:11.753 に答える
0

まったく同じタイプを使用する必要があります。の利点を使用することができますdynamic

public static void foo(ref object a)
{
    a = "foo";
}

static void Main(string[] args)
{
    string bbb = "";
    dynamic a = bbb;        // or object
    foo(ref a);
    bbb = a;                // if it was object you need to cast to string

    Console.WriteLine(bbb); // foo
}
于 2011-06-16T12:27:41.490 に答える
0

参照によって変数を渡す場合、型と正確に一致する必要があります。

正しい型で別の変数を作成することにより、メソッドを呼び出すことができます。

string bbb = "";
object o = bbb;
foo(ref o);

変更された値を文字列変数に戻したい場合は、型を確認してキャストする必要があります。

bbb = o as string;

refキーワードの代わりに戻り値を使用することを検討し、変更された値を返すだけです。

static object foo(object aaa) {

使用法:

o = foo(o);
于 2011-06-16T12:27:14.857 に答える