![](/img/trans.png)
[英]c# out parameter, why I have assigned the value to my variable, still can't return?
[英]Why can't an out parameter have a default value?
當前,當嘗試在采用 out 參數的方法中執行某些操作時,我需要在方法主體中分配 out 參數的值,例如
public static void TryDoSomething(int value, out bool itWorkerd)
{
itWorkerd = true;
if (someFavourableCondition)
{
// if I didn't assign itWorked variable before this point,
// I get an error: "Parameter itWorked must be assigned upon exit.
return;
}
// try to do thing
itWorkerd = // success of attempt to do thing
}
我希望能夠設置itWorked
參數的默認值,這樣我就不必在方法主體中任意設置值。
public static void TryDoSomething(int value, out bool itWorkerd = true)
{
if (someFavourableCondition)
{
// itWorked was already assigned with a default value
// so no compile errors.
return;
}
// try to do thing
itWorkerd = // success of attempt to do thing
}
為什么不能為out
參數分配默認值?
默認值可用於按值傳遞的參數。 該參數仍傳遞給函數,但如果代碼省略了參數,則編譯器提供缺失值。
您提出的功能完全不同。 您建議允許函數的實現者省略設置值,而不是調用者省略傳遞值。 所以,這是一個完全不同的功能。 為什么沒有實施? 以下是一些可能的原因:
我很欣賞這並不完全回答原始問題,但我無法對評論作出貢獻。 我自己也有同樣的問題所以發現自己在這里。
由於C#7現在允許輸出參數有效地成為調用范圍內的變量聲明,因此分配默認值將非常有用。
請考慮以下簡單方法:
private void ResolveStatusName(string statusName, out string statusCode)
{
statusCode = "";
if (statusName != "Any")
{
statusCode = statusName.Length > 1
? statusName.Substring(0, 1)
: statusName;
}
}
修改它是如此直觀:
private void ResolveStatusName(string statusName, out string statusCode = "")
{
if (statusName != "Any")
{
statusCode = statusName.Length > 1
? statusName.Substring(0, 1)
: statusName;
}
}
目的是不僅聲明statusCode
值,還定義它的默認值,但編譯器不允許它。
即使它允許您提供類似的默認值,它仍然需要您為所有返回的參數賦值。 因此,您的默認值將被覆蓋。
方法參數上的out方法參數關鍵字使方法引用傳遞給方法的同一變量。 當控制傳遞回調用方法時,對方法中的參數所做的任何更改都將反映在該變量中。 當您希望方法返回多個值時,聲明out方法很有用。 使用out參數的方法仍然可以返回值。 一個方法可以有多個out參數。 要使用out參數,必須將參數顯式作為out參數傳遞給方法。 out參數的值不會傳遞給out參數。 作為out參數傳遞的變量無需初始化。 但是,必須在方法返回之前為out參數指定一個值。
編譯器不允許您將參數用作默認參數,因為它違反了其用例。 如果你沒有將它傳遞給函數,你就不能在調用函數時使用它的值。
如果你可以調用下面的函數像TryDoSomething(123)
那么沒有使用out參數因為你將無法使用itWorked
值
public static void TryDoSomething(int value, out bool itWorkerd = true)
{
if (someFavourableCondition)
{
// itWorked was already assigned with a default value
// so no compile errors.
return;
}
// try to do thing
itWorkerd = // success of attempt to do thing
}
默認參數值是用於傳遞給該方法的參數的缺省值。 您必須指定一個變量以傳遞out參數,以便您可以獲取返回的值。
在某種程度上,您的第一個示例在方法的開頭設置了默認值。
如果您對使用 'out' 或 'ref' 的方法有兩次調用,並且您想避免將該方法一分為二,如果其中一個調用未使用這些參數,則是一種避免警告的優雅解決方案“未使用該值”(或類似內容)的編譯器將使用以下內容:
方法(“嗨”,出_);
用“out”聲明的方法參數不能由調用者分配其值。 因此在調用期間也不能分配默認值。
此外,在使用參數或從方法返回之前,您必須始終在方法主體中初始化“out”參數。 這將覆蓋任何默認值。
這就是“out”修飾符的全部意義所在。 如果您想要不同的行為,請檢查“ref”和“in”修飾符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.