c# 4.0允许可选的out或ref参数吗?
当前回答
No.
一个解决方法是重载另一个没有out / ref参数的方法,它只调用当前方法。
public bool SomeMethod(out string input)
{
...
}
// new overload
public bool SomeMethod()
{
string temp;
return SomeMethod(out temp);
}
如果你有c# 7.0,你可以简化:
// new overload
public bool SomeMethod()
{
return SomeMethod(out _); // declare out as an inline discard variable
}
(感谢@奥斯卡/ @赖纳指出这一点。)
其他回答
实际上有一种方法可以做到这一点,这是c#允许的。这又回到了c++,并且违背了c#的面向对象结构。
使用这个方法要小心!
下面是使用可选参数声明和编写函数的方法:
unsafe public void OptionalOutParameter(int* pOutParam = null)
{
int lInteger = 5;
// If the parameter is NULL, the caller doesn't care about this value.
if (pOutParam != null)
{
// If it isn't null, the caller has provided the address of an integer.
*pOutParam = lInteger; // Dereference the pointer and assign the return value.
}
}
然后像这样调用函数:
unsafe { OptionalOutParameter(); } // does nothing
int MyInteger = 0;
unsafe { OptionalOutParameter(&MyInteger); } // pass in the address of MyInteger.
为了进行编译,您需要在项目选项中启用不安全代码。这是一个通常不应该使用的解决方案,但如果你为了一些奇怪的,神秘的,管理灵感的决定,确实需要一个可选的out参数在c#中,那么这将允许你这样做。
对于简单类型,您可以使用不安全的代码来实现这一点,尽管这不是惯用的,也不是推荐的。像这样:
// unsafe since remainder can point anywhere
// and we can do arbitrary pointer manipulation
public unsafe int Divide( int x, int y, int* remainder = null ) {
if( null != remainder ) *remainder = x % y;
return x / y;
}
也就是说,没有理论上的原因,c#最终不能使用安全的代码,比如下面的代码:
// safe because remainder must point to a valid int or to nothing
// and we cannot do arbitrary pointer manipulation
public int Divide( int x, int y, out? int remainder = null ) {
if( null != remainder ) *remainder = x % y;
return x / y;
}
事情可能会变得有趣:
// remainder is an optional output parameter
// (to a nullable reference type)
public int Divide( int x, int y, out? object? remainder = null ) {
if( null != remainder ) *remainder = 0 != y ? x % y : null;
return x / y;
}
ICYMI:包括在这里列举的c# 7.0的新特性中,“discards”现在被允许以_的形式作为out参数,让你忽略你不关心的out参数:
p.GetCoordinates(out var x, out _);//我只关心x
附注:如果你也对“输出变量x”的部分感到困惑,请阅读链接上关于“输出变量”的新功能。
正如已经提到的,这是不允许的,我认为这是非常有意义的。 然而,为了增加更多的细节,这里引用了c# 4.0规范21.1节:
Formal parameters of constructors, methods, indexers and delegate types can be declared optional: fixed-parameter: attributesopt parameter-modifieropt type identifier default-argumentopt default-argument: = expression A fixed-parameter with a default-argument is an optional parameter, whereas a fixed-parameter without a default-argument is a required parameter. A required parameter cannot appear after an optional parameter in a formal-parameter-list. A ref or out parameter cannot have a default-argument.
像这样怎么样?
public bool OptionalOutParamMethod([Optional] ref string pOutParam)
{
return true;
}
你仍然需要从c#中传递一个值给参数,但它是一个可选的ref参数。
推荐文章
- c# 4.0可选的out/ref参数
- c# 4.0中的“动态”类型是用来干什么的?
- 平行的。ForEach vs Task.Factory.StartNew
- 动态地向ExpandoObject添加属性
- x = x || y是什么意思?
- 在Tuple类中比"Item1", "Item2"更好的命名
- 普通参数与关键字参数
- .NET NewtonSoft JSON反序列化映射到不同的属性名
- 可选关键字参数的命名元组和默认值
- 如何定义具有可选参数的函数?
- 是否有一种方法在JavaScript函数调用中提供命名参数?
- 为什么在接口上定义的c# 4可选参数没有强制实现类?
- 如何在Swift协议中声明可选方法?
- 任务和线程的区别是什么?
- 如何在c#中使用可选参数?