C#4.0可选的out / ref参数

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

如前所述,这是不允许的,我认为这是非常有意义的。 但是,要添加更多的细节,请参考C#4.0规范第21.1节的引用:

构造函数,方法,索引器和委托types的forms参数可以声明为可选的:

固定参数:
属性opt参数修饰符opttypes标识符default-argument opt
默认参数:
=expression

  • 带有缺省 参数固定 参数可选参数 ,而不带缺省 参数固定 参数必需的参数
  • 正式参数列表中的可选参数后面不能出现所需的参数。
  • refout参数不能有一个默认参数

没有。

解决方法是重载另一个没有 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 string temp); // declare out variable inline } 

(感谢@Oskar指出了这一点。)

不,但另一个很好的select是让该方法为可选参数使用generics模板类,如下所示:

 public class OptionalOut<Type> { public Type Result { get; set; } } 

那么你可以使用它如下:

 public string foo(string value, OptionalOut<int> outResult = null) { // .. do something if (outResult != null) { outResult.Result = 100; } return value; } public void bar () { string str = "bar"; string result; OptionalOut<int> optional = new OptionalOut<int> (); // 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, optional); Console.WriteLine ("Output was {0} with optional value of {1}", result, optional.Result); // example: call it with named optional parameter foo (str, outResult: optional); Console.WriteLine ("Output was {0} with optional value of {1}", result, optional.Result); } 

实际上有一种方法可以做到这一点,是由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. 

为了得到这个编译,你需要在项目选项中启用不安全的代码。 这是一个非常冒险的解决scheme,通常不应该被使用,但是如果你有一些奇怪的,神秘的,神秘的,pipe理层决定,那么在C#中需要一个可选的输出参数,那么这将允许你做到这一点。

ICYMI:包含在这里列举的C#7.0的新function中,现在允许“丢弃”作为输出参数以_的forms出现,以便让您忽略不关心的输出参数:

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

PS如果您也对“out var x”部分感到困惑,请阅读链接上有关“Out Variables”的新function。

这样怎么样?

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

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

 void foo(ref int? n) { return null; }