📄 17.9.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.8.1.htm"><img src="previous.gif" alt="previous" border="0" /></a><a href="17.9.1.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.8.htm"><img src="previous.gif" alt="previous at this level" border="0" /></a><a href="17.10.htm"><img src="next.gif" alt="next at this level" border="0" /></a> <span class="clause-number">17.9</span><span class="clause-title"> Operators</span></span><span class="locator">
Paragraph 1</span><span class="paragraph"><span class="sentence"><span class="sentence-number">1</span> <a name="P1S1"></a>An operator is a member that defines the meaning of an expression operator that can be applied to instances of the class.</span> <span class="sentence"><span class="sentence-number">2</span> <a name="P1S2"></a>Operators are declared using operator-declarations: <span class="grammar-production"><span class="name"><a name="operator-declaration"></a>operator-declaration</span> : <span class="rhs"><span class="non-terminal"><a href="24.2.htm#attributes">attributes</a></span><sub>opt</sub> <span class="non-terminal"><a href="17.9.htm#operator-modifiers">operator-modifiers</a></span> <span class="non-terminal"><a href="17.9.htm#operator-declarator">operator-declarator</a></span> <span class="non-terminal"><a href="17.9.htm#operator-body">operator-body</a></span> </span></span><span class="grammar-production"><span class="name"><a name="operator-modifiers"></a>operator-modifiers</span> : <span class="rhs"><span class="non-terminal"><a href="17.9.htm#operator-modifier">operator-modifier</a></span> </span><span class="rhs"><span class="non-terminal"><a href="17.9.htm#operator-modifiers">operator-modifiers</a></span> <span class="non-terminal"><a href="17.9.htm#operator-modifier">operator-modifier</a></span> </span></span><span class="grammar-production"><span class="name"><a name="operator-modifier"></a>operator-modifier</span> : <span class="rhs"><span class="keyword">public</span> </span><span class="rhs"><span class="keyword">static</span> </span><span class="rhs"><span class="keyword">extern</span> </span></span><span class="grammar-production"><span class="name"><a name="operator-declarator"></a>operator-declarator</span> : <span class="rhs"><span class="non-terminal"><a href="17.9.htm#unary-operator-declarator">unary-operator-declarator</a></span> </span><span class="rhs"><span class="non-terminal"><a href="17.9.htm#binary-operator-declarator">binary-operator-declarator</a></span> </span><span class="rhs"><span class="non-terminal"><a href="17.9.htm#conversion-operator-declarator">conversion-operator-declarator</a></span> </span></span><span class="grammar-production"><span class="name"><a name="unary-operator-declarator"></a>unary-operator-declarator</span> : <span class="rhs"><span class="non-terminal"><a href="11.htm#type">type</a></span> <span class="keyword">operator</span> <span class="non-terminal"><a href="17.9.htm#overloadable-unary-operator">overloadable-unary-operator</a></span> <span class="terminal">(</span> <span class="non-terminal"><a href="11.htm#type">type</a></span> <span class="non-terminal"><a href="9.4.2.htm#identifier">identifier</a></span> <span class="terminal">)</span> </span></span><span class="grammar-production"><span class="name"><a name="overloadable-unary-operator"></a>overloadable-unary-operator</span> : one of <span class="rhs"><span class="terminal">+</span> <span class="terminal">-</span> <span class="terminal">!</span> <span class="terminal">~</span> <span class="terminal">++</span> <span class="terminal">--</span> <span class="keyword">true</span> <span class="keyword">false</span> </span></span><span class="grammar-production"><span class="name"><a name="binary-operator-declarator"></a>binary-operator-declarator</span> : <span class="rhs"><span class="non-terminal"><a href="11.htm#type">type</a></span> <span class="keyword">operator</span> <span class="non-terminal"><a href="17.9.htm#overloadable-binary-operator">overloadable-binary-operator</a></span> <span class="terminal">(</span> <span class="non-terminal"><a href="11.htm#type">type</a></span> <span class="non-terminal"><a href="9.4.2.htm#identifier">identifier</a></span> <span class="terminal">,</span> <span class="non-terminal"><a href="11.htm#type">type</a></span> <span class="non-terminal"><a href="9.4.2.htm#identifier">identifier</a></span> <span class="terminal">)</span> </span></span><span class="grammar-production"><span class="name"><a name="overloadable-binary-operator"></a>overloadable-binary-operator</span> : one of <span class="rhs"><span class="terminal">+</span> <span class="terminal">-</span> <span class="terminal">*</span> <span class="terminal">/</span> <span class="terminal">%</span> <span class="terminal">&</span> <span class="terminal">|</span> <span class="terminal">^</span> <span class="terminal"><<</span> <span class="terminal">>></span> <span class="terminal">==</span> <span class="terminal">!=</span> <span class="terminal">></span> <span class="terminal"><</span> <span class="terminal">>=</span> <span class="terminal"><=</span> </span></span><span class="grammar-production"><span class="name"><a name="conversion-operator-declarator"></a>conversion-operator-declarator</span> : <span class="rhs"><span class="keyword">implicit</span> <span class="keyword">operator</span> <span class="non-terminal"><a href="11.htm#type">type</a></span> <span class="terminal">(</span> <span class="non-terminal"><a href="11.htm#type">type</a></span> <span class="non-terminal"><a href="9.4.2.htm#identifier">identifier</a></span> <span class="terminal">)</span> </span><span class="rhs"><span class="keyword">explicit</span> <span class="keyword">operator</span> <span class="non-terminal"><a href="11.htm#type">type</a></span> <span class="terminal">(</span> <span class="non-terminal"><a href="11.htm#type">type</a></span> <span class="non-terminal"><a href="9.4.2.htm#identifier">identifier</a></span> <span class="terminal">)</span> </span></span><span class="grammar-production"><span class="name"><a name="operator-body"></a>operator-body</span> : <span class="rhs"><span class="non-terminal"><a href="15.2.htm#block">block</a></span> </span><span class="rhs"><span class="terminal">;</span> </span></span></span></span><span class="paragraph"><span class="sentence"><span class="sentence-number">3</span> <a name="P1S3"></a>There are three categories of overloadable operators: Unary operators (<a href="17.9.1.htm">§17.9.1</a>), binary operators (<a href="17.9.2.htm">§17.9.2</a>), and conversion operators (<a href="17.9.3.htm">§17.9.3</a>).</span> </span><span class="locator">
Paragraph 2</span><span class="paragraph"><span class="sentence"><span class="sentence-number">1</span> <a name="P2S1"></a>When an operator declaration includes an extern modifier, the operator is said to be an external operator.</span> <span class="sentence"><span class="sentence-number">2</span> <a name="P2S2"></a>Because an external operator provides no actual implementation, its <span class="non-terminal"><a href="17.9.htm#operator-body">operator-body</a></span> consists of a semi-colon.</span> <span class="sentence"><span class="sentence-number">3</span> <a name="P2S3"></a>For all other operators, the <span class="non-terminal"><a href="17.9.htm#operator-body">operator-body</a></span> consists of a block, which specifies the statements to execute when the operator is invoked.</span> <span class="sentence"><span class="sentence-number">4</span> <a name="P2S4"></a>The block of an operator must conform to the rules for value-returning methods described in <a href="17.5.8.htm">§17.5.8</a>.</span> </span><span class="locator">
Paragraph 3</span><span class="paragraph"><span class="sentence"><span class="sentence-number">1</span> <a name="P3S1"></a>The following rules apply to all operator declarations: </span><ul><li><span class="sentence"><span class="sentence-number">2</span> <a name="P3S2"></a> An operator declaration must include both a public and a static modifier.</span> </li><li><span class="sentence"><span class="sentence-number">3</span> <a name="P3S3"></a> The parameter(s) of an operator must be value parameters.</span> <span class="sentence"><span class="sentence-number">4</span> <a name="P3S4"></a>It is a compile-time error for an operator declaration to specify ref or out parameters.</span> </li><li><span class="sentence"><span class="sentence-number">5</span> <a name="P3S5"></a> The signature of an operator (<a href="17.9.1.htm">§17.9.1</a>, <a href="17.9.2.htm">§17.9.2</a>, <a href="17.9.3.htm">§17.9.3</a>) must differ from the signatures of all other operators declared in the same class.</span> </li><li><span class="sentence"><span class="sentence-number">6</span> <a name="P3S6"></a> All types referenced in an operator declaration must be at least as accessible as the operator itself (<a href="10.5.4.htm">§10.5.4</a>).</span> </li><li><span class="sentence"><span class="sentence-number">7</span> <a name="P3S7"></a> It is an error for the same modifier to appear multiple times in an operator declaration.</span> </li></ul></span><span class="locator">
Paragraph 4</span><span class="paragraph"><span class="sentence"><span class="sentence-number">1</span> <a name="P4S1"></a>Each operator category imposes additional restrictions, as described in the following sections.</span> </span><span class="locator">
Paragraph 5</span><span class="paragraph"><span class="sentence"><span class="sentence-number">1</span> <a name="P5S1"></a>Like other members, operators declared in a base class are inherited by derived classes.</span> <span class="sentence"><span class="sentence-number">2</span> <a name="P5S2"></a>Because operator declarations always require the class or struct in which the operator is declared to participate in the signature of the operator, it is not possible for an operator declared in a derived class to hide an operator declared in a base class.</span> <span class="sentence"><span class="sentence-number">3</span> <a name="P5S3"></a>Thus, the new modifier is never required, and therefore never permitted, in an operator declaration.</span> </span><span class="locator">
Paragraph 6</span><span class="paragraph"><span class="sentence"><span class="sentence-number">1</span> <a name="P6S1"></a>Additional information on unary and binary operators can be found in <a href="14.2.htm">§14.2</a>.</span> </span><span class="locator">
Paragraph 7</span><span class="paragraph"><span class="sentence"><span class="sentence-number">1</span> <a name="P7S1"></a>Additional information on conversion operators can be found in <a href="13.4.htm">§13.4</a>.</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 + -