[英]cannot convert type 'string' to 'int?' via a reference conversion, boxing conversion, unboxing conversion, wrapping conversion or null type conversion
[英]boxing an int won't convert it to reference type?
糾正我,如果我錯誤的拳擊轉換值類型為引用類型然后為什么以下代碼給10輸出而不是12?
public static void fun(Object obj)
{
obj =12;
}
static void Main(string[] args)
{
int value =10;
Object obj = value;
fun(obj);
Console.WriteLine((int)obj);
}
因為當你調用fun
時,你實際上並沒有在Main
方法中修改obj
的值。 該值被賦予fun
並在那里改變,因為它本質上是該變量的副本,因為它是通過值而不是通過引用傳遞的。
使用ref
關鍵字:
public static void fun(ref Object obj)
{
obj = 12;
}
static void Main(string[] args)
{
int value = 10;
Object obj = value;
fun(ref obj);
Console.WriteLine((int)obj);
}
或者讓你的fun
方法返回新值:
public static Object fun(Object obj)
{
obj = 12;
return obj;
}
static void Main(string[] args)
{
int value = 10;
Object obj = value;
obj = fun(obj);
Console.WriteLine((int)obj);
}
這與裝箱/拆箱無關。 您只是在方法中創建一個新對象,並用它替換傳遞的參數。 由於你沒有傳遞參數作為ref
因此調用代碼不受影響。
將您的方法聲明為
public static void fun(ref Object obj)
並將通話更改為
fun(ref obj);
那么它將輸出12。
.NET函數調用按值傳遞參數,而不是通過引用傳遞(除非使用ref
或out
)。 即,只要在函數內部為函數的參數賦值,就不會在函數外部看到更改。 即使對於引用類型,您仍然傳遞引用,但仍然按值傳遞這些引用。
因為您將值作為值類型傳遞給函數。 您應該將對象作為引用類型傳遞。
public static void Main(string[] args)
{
int value =10;
Object obj = value;
fun(ref obj);
Console.WriteLine((int)obj);
}
public static void fun(ref Object obj)
{
obj =12;
}
它的值類型或引用類型無關緊要。
將變量傳遞給函數時,將使用變量分配函數中的參數。 他們都指向同一個實例。 但是在函數內部為它分配一個新值,所以它是一個新實例。 前一個當然不會改變。
這與:
object o = 10;
object o2 = o;
o2=12;
o
仍然是10,而o2
是12
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.