[英]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
}
}
有誰能解釋一下? 我猜這與ref對派生類非常嚴格有關。
有什么辦法可以將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.