2013-08-19 25 views
-1

我已經在C#下面的代碼值設置爲「out」參數必須在方法體中分配,否則該方法不會被編譯

class Sample{ 
public void sum(out int num1,int num2) 
{ 
} 
public void print() 
{ int i=12; 
sum(out i,10); 
Console.WriteLine(i); 
} 
} 

我已閱讀,它就像「裁判」,那麼爲什麼下面的代碼會給出錯誤說:「在控制離開當前方法之前必須分配out參數'num1',即使我沒有寫入任何語句或者沒有使用num1,並且我已經在callee方法中爲它賦值了?

如果我沒有使用或初始化參數,那麼爲什麼它沒有初始化爲默認值,對於這裏num1 = 0,並將該值返回給Calee方法?

+0

'sum'方法的用途是什麼? – V4Vendetta

+0

@ V4Vendeta它只是一個示例代碼。告訴我在內存中發生了什麼? – dnyaneshwar

回答

1

與具有返回類型的函數必須在所有代碼路徑上返回值相似,具有out參數的函數還必須爲所有代碼路徑上的out參數指定一個值。

1

這就是out參數的定義。這意味着它在調用之前不必設置,通常也不會設置,並且帶有out參數的方法將設置它。如果您想事先設置它,並且能夠在該方法中修改它,則應該使用ref而不是out。

3

這是設計。

out parameter modifier (C# Reference)

Although variables passed as out arguments do not have to be initialized before being passed, the called method is required to assign a value before the method returns.

3

。你可以想象這是一個替代方法來返回值返回之間的顯着差異是你只能返回一個值,但的各種數值。當你的方法需要輸出不止一個值時,這是特別有用的,例如bool Dictionary<TKey, TValue>.TryGetValue(TKey key, out TValue value)

您看到的錯誤就像您聲明的方法返回值而不指定要返回的內容。在代碼達到可到達端點之前,必須先指定out參數。寫一個分配一個值到輸出參數的聲明是擺脫錯誤的常用方法:

public static void OutOfAssgnment<T>(out T value) { 
    value=default(T); 
} 

但也有,事實上,至少有三種方法等,使之編譯:

public static void OutOfAnotherOut<T>(out T value) { 
    OutOfAnotherOut(out value); // not necessarily be recursive, just an example 
} 

public static void OutOfThrowing<T>(out T value) { 
    throw new Exception(); 
} 

public static void OutOfInfiniteLoop<T>(out T value) { 
    for(; ;) 
     ; 
} 

後兩者不分配out參數的值,但會使端點無法訪問也會編譯。

相關問題