C#4.0可选的out / ref参数

问题描述 投票:190回答:9

C#4.0是否允许可选的outref参数?

c#-4.0 optional-parameters optional-arguments
9个回答
5
投票

ICYMI:包含在C#7.0枚举的here的新功能中,“discards”现在允许作为_形式的out参数,让你忽略掉你不关心的参数:

p.GetCoordinates(out var x, out _); // I only care about x

附:如果您还对“out var x”部分感到困惑,请阅读链接上有关“Out Variables”的新功能。


1
投票

不,但您可以使用代理人(例如Action)作为替代方案。

部分由Robin R的答案启发,面对我认为我想要一个可选输出参数的情况,我改为使用了Action委托。我借用了他的示例代码来修改Action<int>的使用,以显示差异和相似之处:

public string foo(string value, Action<int> outResult = null)
{
    // .. do something

    outResult?.Invoke(100);

    return value;
}

public void bar ()
{
    string str = "bar";

    string result;
    int optional = 0;

    // example: call without the optional out parameter
    result = foo (str);
    Console.WriteLine ("Output was {0} with no optional value used", result);

    // example: call it with optional parameter
    result = foo (str, x => optional = x);
    Console.WriteLine ("Output was {0} with optional value of {1}", result, optional);

    // example: call it with named optional parameter
    foo (str, outResult: x => optional = x);
    Console.WriteLine ("Output was {0} with optional value of {1}", result, optional);
}

这样做的好处是,可选变量作为普通的int出现在源代码中(编译器将它包装在一个闭包类中,而不是将它显式地包装在用户定义的类中)。

变量需要显式初始化,因为编译器不能假设在函数调用退出之前将调用Action

它不适用于所有用例,但适用于我的实际用例(为单元测试提供数据的函数,以及新单元测试需要访问返回值中不存在的某个内部状态的函数)。


0
投票

使用不带out参数的重载方法来调用带有C#6.0及更低版本的out参数的方法。我不确定为什么C#7.0 for .NET Core甚至是这个线程的正确答案,当特别询问C#4.0是否可以有一个可选的out参数时。答案是不!


-2
投票

这样怎么样?

public bool OptionalOutParamMethod([Optional] ref string pOutParam)
{
    return true;
}

您仍然必须将值传递给C#中的参数,但它是一个可选的参数参数。


-4
投票
void foo(ref int? n)
{
    return null;
}
© www.soinside.com 2019 - 2024. All rights reserved.