⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 17.5.1.4.htm

📁 This ECMA Standard specifies the form and establishes the interpretation of programs written in the
💻 HTM
字号:
<html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>Hyperlinked ECMA C# Language Specification</title><meta name="author" content="Jon Jagger" /><link rel="stylesheet" href="ecma334.css"></link></head><body><div align="right"><em><a href="http://www.jaggersoft.com">Jon Jagger</a></em></div><div align="right"><a href="mailto:jon@jaggersoft.com">jon@jaggersoft.com</a></div><form method="get" action="http://search.atomz.com/search/"><input size="30" name="sp-q"></input><input type="submit" value="Search C# Spec"></input><input type="hidden" name="sp-a" value="sp10024177"></input><input type="hidden" name="sp-f" value="ISO-8859-1"></input></form><a href="toc.htm">Table of Contents</a> <a href="1.htm">1</a> <a href="2.htm">2</a> <a href="3.htm">3</a> <a href="4.htm">4</a> <a href="5.htm">5</a> <a href="6.htm">6</a> <a href="7.htm">7</a> <a href="8.htm">8</a> <a href="9.htm">9</a> <a href="10.htm">10</a> <a href="11.htm">11</a> <a href="12.htm">12</a> <a href="13.htm">13</a> <a href="14.htm">14</a> <a href="15.htm">15</a> <a href="16.htm">16</a> <a href="17.htm">17</a> <a href="18.htm">18</a> <a href="19.htm">19</a> <a href="20.htm">20</a> <a href="21.htm">21</a> <a href="22.htm">22</a> <a href="23.htm">23</a> <a href="24.htm">24</a> <a href="25.htm">25</a> <a href="notes.htm">Notes</a> <a href="HyperlinkedCSharpECMA.zip">Download</a><span class="ruler"></span><span class="heading">ECMA-334 C# Language Specification</span><span class="navigate"><a href="17.5.1.3.htm"><img src="previous.gif" alt="previous" border="0" /></a><a href="17.5.2.htm"><img src="next.gif" alt="next" border="0" /></a></span><span class="clause-depth"><a href="16.htm"><img src="previous.gif" alt="previous at this level" border="0" /></a><a href="18.htm"><img src="next.gif" alt="next at this level" border="0" /></a> <span class="clause-number-link"><a href="17.htm">17</a></span><span class="clause-title-previous"> Classes</span></span><span class="clause-depth"><a href="17.4.htm"><img src="previous.gif" alt="previous at this level" border="0" /></a><a href="17.6.htm"><img src="next.gif" alt="next at this level" border="0" /></a> <span class="clause-number-link"><a href="17.5.htm">17.5</a></span><span class="clause-title-previous"> Methods</span></span><span class="clause-depth"><a href="17.5.1.htm"><img src="previous.gif" alt="previous at this level" border="0" /></a><a href="17.5.2.htm"><img src="next.gif" alt="next at this level" border="0" /></a> <span class="clause-number-link"><a href="17.5.1.htm">17.5.1</a></span><span class="clause-title-previous"> Method parameters</span></span><span class="clause-depth"><a href="17.5.1.3.htm"><img src="previous.gif" alt="previous at this level" border="0" /></a><a href="17.5.1.4.htm"><img src="next.gif" alt="next at this level" border="0" /></a> <span class="clause-number">17.5.1.4</span><span class="clause-title"> Parameter arrays</span></span><span class="locator">
     Paragraph 1</span><span class="paragraph"><span class="sentence"><span class="sentence-number">1</span> <a name="P1S1"></a>A parameter declared with a params modifier is a parameter array.</span> <span class="sentence"><span class="sentence-number">2</span> <a name="P1S2"></a>If a formal parameter list includes a parameter array, it must be the last parameter in the list and it must be of a single-dimensional array type.</span> </span><span class="paragraph"><span class="example">[Example: For example, the types string[] and string[][] can be used as the type of a parameter array, but the type string[,] can not. end example]</span> <span class="sentence"><span class="sentence-number">3</span> <a name="P1S3"></a>It is not possible to combine the params modifier with the modifiers ref and out.</span> </span><span class="locator">
     Paragraph 2</span><span class="paragraph"><span class="sentence"><span class="sentence-number">1</span> <a name="P2S1"></a>A parameter array permits arguments to be specified in one of two ways in a method invocation: </span><ul><li><span class="sentence"><span class="sentence-number">2</span> <a name="P2S2"></a> The argument given for a parameter array can be a single expression of a type that is implicitly convertible (<a href="13.1.htm">&#167;13.1</a>) to the parameter array type.</span> <span class="sentence"><span class="sentence-number">3</span> <a name="P2S3"></a>In this case, the parameter array acts precisely like a value parameter.</span> </li><li><span class="sentence"><span class="sentence-number">4</span> <a name="P2S4"></a> Alternatively, the invocation can specify zero or more arguments for the parameter array, where each argument is an expression of a type that is implicitly convertible (<a href="13.1.htm">&#167;13.1</a>) to the element type of the parameter array.</span> <span class="sentence"><span class="sentence-number">5</span> <a name="P2S5"></a>In this case, the invocation creates an instance of the parameter array type with a length corresponding to the number of arguments, initializes the elements of the array instance with the given argument values, and uses the newly created array instance as the actual argument.</span> </li></ul></span><span class="locator">
     Paragraph 3</span><span class="paragraph"><span class="sentence"><span class="sentence-number">1</span> <a name="P3S1"></a>Except for allowing a variable number of arguments in an invocation, a parameter array is precisely equivalent to a value parameter (<a href="17.5.1.1.htm">&#167;17.5.1.1</a>) of the same type.</span> </span><span class="paragraph"><span class="example">[Example: The example <pre class="code-example">
using System;  
class Test  
{  
   static void F(params int[] args) {  
      Console.Write("Array contains {0} elements:", args.Length);  
      foreach (int i in args)  
      Console.Write(" {0}", i);  
      Console.WriteLine();  
   }  
   static void Main() {  
      int[] arr = {1, 2, 3};  
      F(arr);  
      F(10, 20, 30, 40);  
      F();  
   }  
}  
</pre>produces the output <pre class="code-example">
Array contains 3 elements: 1 2 3  
Array contains 4 elements: 10 20 30 40  
Array contains 0 elements:  
</pre></span></span><span class="paragraph"><span class="example">The first invocation of F simply passes the array a as a value parameter. The second invocation of F automatically creates a four-element int[] with the given element values and passes that array instance as a value parameter. Likewise, the third invocation of F creates a zero-element int[] and passes that instance as a value parameter. The second and third invocations are precisely equivalent to writing: <pre class="code-example">
F(new int[] {10, 20, 30, 40});  
F(new int[] {});  
</pre>end example]</span> </span><span class="locator">
     Paragraph 4</span><span class="paragraph"><span class="sentence"><span class="sentence-number">1</span> <a name="P4S1"></a>When performing overload resolution, a method with a parameter array may be applicable either in its normal form or in its expanded form (<a href="14.4.2.1.htm">&#167;14.4.2.1</a>).</span> <span class="sentence"><span class="sentence-number">2</span> <a name="P4S2"></a>The expanded form of a method is available only if the normal form of the method is not applicable and only if a method with the same signature as the expanded form is not already declared in the same type.</span> </span><span class="paragraph"><span class="example">[Example: The example <pre class="code-example">
using System;  
class Test  
{  
   static void F(params object[] a) {  
      Console.WriteLine("F(object[])");  
   }  
   static void F() {  
      Console.WriteLine("F()");  
   }  
   static void F(object a0, object a1) {  
      Console.WriteLine("F(object,object)");  
   }  
   static void Main() {  
      F();  
      F(1);  
      F(1, 2);  
      F(1, 2, 3);  
      F(1, 2, 3, 4);  
   }  
}  
</pre>produces the output <pre class="code-example">
F();  
F(object[]);  
F(object,object);  
F(object[]);  
F(object[]);  
</pre></span></span><span class="paragraph"><span class="example">In the example, two of the possible expanded forms of the method with a parameter array are already included in the class as regular methods. These expanded forms are therefore not considered when performing overload resolution, and the first and third method invocations thus select the regular methods. </span></span><span class="paragraph"><span class="example">When a class declares a method with a parameter array, it is not uncommon to also include some of the expanded forms as regular methods. By doing so it is possible to avoid the allocation of an array instance that occurs when an expanded form of a method with a parameter array is invoked. end example]</span> </span><span class="locator">
     Paragraph 5</span><span class="paragraph"><span class="sentence"><span class="sentence-number">1</span> <a name="P5S1"></a>When the type of a parameter array is object[], a potential ambiguity arises between the normal form of the method and the expended form for a single object parameter.</span> <span class="sentence"><span class="sentence-number">2</span> <a name="P5S2"></a>The reason for the ambiguity is that an object[] is itself implicitly convertible to type object.</span> <span class="sentence"><span class="sentence-number">3</span> <a name="P5S3"></a>The ambiguity presents no problem, however, since it can be resolved by inserting a cast if needed.</span> </span><span class="paragraph"><span class="example">[Example: The example <pre class="code-example">
using System;  
class Test  
{  
   static void F(params object[] args) {  
      foreach (object o in args) {  
         Console.Write(o.GetType().FullName);  
         Console.Write(" ");  
      }  
      Console.WriteLine();  
   }  
   static void Main() {  
      object[] a = {1, "Hello", 123.456};  
      object o = a;  
      F(a);  
      F((object)a);  
      F(o);  
      F((object[])o);  
   }  
}  
</pre>produces the output <pre class="code-example">
System.Int32 System.String System.Double  
System.Object[]  
System.Object[]  
System.Int32 System.String System.Double  
</pre></span></span><span class="paragraph"><span class="example">In the first and last invocations of F, the normal form of F is applicable because an implicit conversion exists from the argument type to the parameter type (both are of type object[]). Thus, overload resolution selects the normal form of F, and the argument is passed as a regular value parameter. In the second and third invocations, the normal form of F is not applicable because no implicit conversion exists from the argument type to the parameter type (type object cannot be implicitly converted to type object[]). However, the expanded form of F is applicable, so it is selected by overload resolution. As a result, a one-element object[] is created by the invocation, and the single element of the array is initialized with the given argument value (which itself is a reference to an object[]). end example]</span> </span><span class="ruler"></span><table><tr><td><table align="left" bgcolor="navy"><tr bgcolor="navy"><td><font face="Arial,sans-serif" size="6" color="yellow"><strong>{ JSL }</strong></font></td></tr></table></td></tr><tr><td><font face="Arial,sans-serif" size="2" color="navy"><strong>Jagger Software Ltd</strong></font></td></tr><tr><td><font face="Arial,sans-serif" size="2" color="navy"><strong>Company # 4070126</strong></font></td></tr><tr><td><font face="Arial,sans-serif" size="2" color="navy"><strong>VAT # 762 5213 42</strong></font></td></tr></table><img src="valid-html401.png" align="left" height="31" width="88" alt="Valid HTML 4.01" /><img src="vcss.gif" align="left" height="31" width="88" alt="Valid CSS" /></body></html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -