簡體   English   中英

通過'ref'傳遞 - c#

[英]Passing by 'ref' - c#

令我沮喪的是,以下代碼不會編譯。

但是,如果我刪除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. 有誰能解釋一下? 我猜這與ref對派生類非常嚴格有關。

  2. 有什么辦法可以將string類型的對象傳遞給foo(ref object varname)嗎?

它必須完全匹配,否則foo可以做到:

aaa = 123;

哪個對foo有效(它會將int到一個object ),但不適用於bar (它是一個string )。

兩個直接選擇; 首先,使用中間變量和類型檢查:

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

或者,也許嘗試泛型( foo<T>(ref T aaa) ); 或者將bbb視為object而不是string

不,沒有。 想象一下:

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

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

Foo會嘗試將SomeObject分配給一個實際上是string的變量!

當您通過引用傳遞變量時,它必須與該類型完全匹配。

您可以通過創建具有正確類型的另一個變量來調用該方法:

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

如果您希望將更改后的值返回到字符串變量中,則必須檢查類型並將其強制轉換:

bbb = o as string;

考慮使用返回值而不是ref關鍵字,只返回更改的值:

static object foo(object aaa) {

用法:

o = foo(o);

您必須使用完全相同的類型。 您可以利用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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM