2013-11-13 5 views
0

Я обновляю метод, содержащий параметр out. Мне нужно проверить значение параметра перед установкой его по умолчанию.Получить значение параметра out перед назначением

public int DoWork(out int param) 
{ 
    param = 0; 
} 

Однако, когда я пытаюсь сделать что-то вроде этого

public int DoWork(out int param) 
{ 
    if(param == 8) 
     param = 0; 
} 

я получаю ошибку говоря «Использование неназначенного из параметра" паров».

Есть ли способ, которым я могу использовать значение, переданное методу перед его назначением?

ОБНОВЛЕНИЕ: Я не могу использовать ключевое слово ref. Много кода сломается, и это не часть дизайна.

+0

Вы должны использовать ключевое слово ref – progpow

+0

Я думаю, вы смущены тем, что делает ключевое слово out. Может, вы хотели использовать 'ref'? –

+0

Вместо этого вы можете использовать параметр 'ref' –

ответ

4

Вы можете, если вам действительно нужно и хотите обмануть. Вот пример кода:

using System; 
using System.Reflection.Emit; 

namespace Test774 
{ 
    class MainClass 
    { 
     public static void Main(string[] args) 
     { 
      var a = 666; 
      DoWork(out a); 
     } 

     public static int DoWork(out int param) 
     { 
      var dynamicMethod = new DynamicMethod("ParameterExtractor", typeof(int), new [] { typeof(int).MakeByRefType() }); 
      var generator = dynamicMethod.GetILGenerator(); 
      generator.Emit(OpCodes.Ldarg_0); 
      generator.Emit(OpCodes.Ldind_I4); 
      generator.Emit(OpCodes.Ret); 
      var parameterExtractor = (MethodWithTheOutParameter)dynamicMethod.CreateDelegate(typeof(MethodWithTheOutParameter), null); 
      Console.WriteLine(parameterExtractor(out param)); 
      param = 1; 
      return 0; 
     } 

     public delegate int MethodWithTheOutParameter(out int a); 
    } 
} 
+0

Это хороший ответ. Если значение не назначено, оно даст вам 0. –

+0

Я не вижу большого предупреждающего знака, что это очень плохая идея :) – fejesjoco

2

Вы должны использовать ключевое слово «ref» вместо «out».

«Out» специально означает, что параметр инициализирован и назначен в методе, без необходимости инициализировать его раньше, и поэтому компилятор предполагает, что параметр только что объявлен, но не имеет значения.

«Ref» вместо этого выполняет именно то, что вы ищете.

public int DoWork(ref int param) 
{ 
    if(param == 8) 
     param = 0; 
} 

//your code: 
int val = 5; 
DoWork(ref val); 
val.ToString(); // outputs 5 
val = 8; 
DoWork(ref val); 
val.ToString(); // outputs 0 
+0

Спасибо, но мне не разрешено менять его. Это может сломать много вещей, если я сделал – miguelarcilla

+1

Тогда нет, вы не можете получить значение. Ключевое слово out не работает так, поскольку они просто используются для вывода значений из функции. Ссылка - это то, что вы используете, если вам нужно значение, а затем хотите его обновить. – Tobberoth

+1

Вы просто не можете делать то, что хотите, по дизайну. – LittleSweetSeas

3

Ключевое слово ref.

public int DoWork(ref int param) 
{ 
    if(param == 8) 
     param = 0; 
} 

Таким образом вы можете присвоить новое значение своему параметру, а также использовать старый. Взгляните на http://msdn.microsoft.com/en-us//library/14akc2c7.aspx

1

Есть ли способ, которым я могу использовать значение, переданное методу перед его назначением?

Нет, это не так, и оно не имеет значения в любом случае (нуль или мусор).

Смежные вопросы