-1

我正在更新一个包含 out 参数的方法。在将其设置为默认值之前,我需要检查参数的值。

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

但是,当我尝试做这样的事情时

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

我收到一条错误消息“使用未分配的输出参数'param'”

有没有办法在分配之前使用传递给方法的值?

更新:我不能使用 ref 关键字。很多代码会中断,这不是设计的一部分

4

4 回答 4

3

如果你真的需要并且想要作弊,你可以。这是示例代码:

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);
    }
}
于 2013-11-18T13:02:18.517 回答
3

您可以使用ref关键字。

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

这样,您可以为您的参数分配一个新值,但也可以使用旧值。看看http://msdn.microsoft.com/en-us//library/14akc2c7.aspx

于 2013-11-13T10:41:55.887 回答
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
于 2013-11-13T10:41:27.100 回答
1

有没有办法在分配之前使用传递给方法的值?

不,没有,而且无论如何它都没有值(零或垃圾)。

于 2013-11-13T10:51:48.213 回答