Methods
A method is a member that implements a computation or action that can be performed by an object or class. Methods are declared using method-declarations: method-declaration: method-header: method-modifiers: method-modifier: return-type: member-name: method-body: A method-declaration may include a set of attributes (§17) and a valid combination of the four access modifiers (§10.3.5), the new (§10.3.4), static (§10.6.2), virtual (§10.6.3), override (§10.6.4), sealed (§10.6.5), abstract (§10.6.6), and extern (§10.6.7) modifiers. A declaration has a valid combination of modifiers if all of the following are true: · The declaration includes a valid combination of access modifiers (§10.3.5). · The declaration does not include the same modifier multiple times. · The declaration includes at most one of the following modifiers: static, virtual, and override. · The declaration includes at most one of the following modifiers: new and override. · If the declaration includes the abstract modifier, then the declaration does not include any of the following modifiers: static, virtual, sealed or extern. · If the declaration includes the private modifier, then the declaration does not include any of the following modifiers: virtual, override, or abstract. · If the declaration includes the sealed modifier, then the declaration also includes the override modifier. · If the declaration includes the partial modifier, then it does not include any of the following modifiers: new, public, protected, internal, private, virtual, sealed, override, abstract, or extern. A method that has the async modifier is an async function and follows the rules described in §10.14. The return-type of a method declaration specifies the type of the value computed and returned by the method. The return-type is void if the method does not return a value. If the declaration includes the partial modifier, then the return type must be void. The member-name specifies the name of the method. Unless the method is an explicit interface member implementation (§13.4.1), the member-name is simply an identifier. For an explicit interface member implementation, the member-name consists of an interface-type followed by a “.” and an identifier. The optional type-parameter-list specifies the type parameters of the method (§10.1.3). If a type-parameter-list is specified the method is a generic method. If the method has an extern modifier, a type-parameter-list cannot be specified. The optional formal-parameter-list specifies the parameters of the method (§10.6.1). The optional type-parameter-constraints-clauses specify constraints on individual type parameters (§10.1.5) and may only be specified if a type-parameter-list is also supplied, and the method does not have an override modifier. The return-type and each of the types referenced in the formal-parameter-list of a method must be at least as accessible as the method itself (§3.5.4). For abstract and extern methods, the method-body consists simply of a semicolon. For partial methods the method-body may consist of either a semicolon or a block. For all other methods, the method-body consists of a block, which specifies the statements to execute when the method is invoked. If the method-body consists of a semicolon, the the declaration may not include the async modifier. The name, the type parameter list and the formal parameter list of a method define the signature (§3.6) of the method. Specifically, the signature of a method consists of its name, the number of type parameters and the number, modifiers, and types of its formal parameters. For these purposes, any type parameter of the method that occurs in the type of a formal parameter is identified not by its name, but by its ordinal position in the type argument list of the method.The return type is not part of a method’s signature, nor are the names of the type parameters or the formal parameters. The name of a method must differ from the names of all other non-methods declared in the same class. In addition, the signature of a method must differ from the signatures of all other methods declared in the same class, and two methods declared in the same class may not have signatures that differ solely by ref and out. The method’s type-parameters are in scope throughout the method-declaration, and can be used to form types throughout that scope in return-type, method-body, and type-parameter-constraints-clauses but not in attributes. All formal parameters and type parameters must have different names.
|