Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
C-sharp language specification.2004.pdf
Скачиваний:
14
Добавлен:
23.08.2013
Размер:
2.55 Mб
Скачать

C# LANGUAGE SPECIFICATION

1chosen. For instance, if the index expression is of type short then an implicit conversion to int is

2performed, since implicit conversions from short to int and from short to long are possible. If

3evaluation of an index expression or the subsequent implicit conversion causes an exception, then no

4further index expressions are evaluated and no further steps are executed.

5The value of P is checked to be valid. If the value of P is null, a

6System.NullReferenceException is thrown and no further steps are executed.

7The value of each expression in the expression-list is checked against the actual bounds of each

8dimension of the array instance referenced by P. If one or more values are out of range, a

9System.IndexOutOfRangeException is thrown and no further steps are executed.

10The location of the array element given by the index expression(s) is computed, and this location

11becomes the result of the array access.

1214.5.6.2 Indexer access

13For an indexer access, the primary-no-array-creation-expression of the element-access shall be a variable

14or value of a class, struct, or interface type, and this type shall implement one or more indexers that are

15applicable with respect to the expression-list of the element-access.

16The compile-time processing of an indexer access of the form P[A], where P is a primary-no-array-

17creation-expression of a class, struct, or interface type T, and A is an expression-list, consists of the

18following steps:

19The set of indexers provided by T is constructed. The set consists of all indexers declared in T or a base

20type of T that are not override declarations and are accessible in the current context (§10.5).

21The set is reduced to those indexers that are applicable and not hidden by other indexers. The following

22rules are applied to each indexer S.I in the set, where S is the type in which the indexer I is declared:

23o If I is not applicable with respect to A (§14.4.2.1), then I is removed from the set.

24o If I is applicable with respect to A (§14.4.2.1), then all indexers declared in a base type of S are

25removed from the set.

26If the resulting set of candidate indexers is empty, then no applicable indexers exist, and a compile-time

27error occurs. If the candidate indexers are not all declared in the same type, the indexer access is

28ambiguous, and a compile-time error occurs (this latter situation can only occur for an indexer access on

29an instance of an interface that has multiple direct base interfaces, or for an invocation of an indexer on a

30type parameter).

31The best indexer of the set of candidate indexers is identified using the overload resolution rules of

32§14.4.2. If a single best indexer cannot be identified, the indexer access is ambiguous, and a compile-

33time error occurs.

34The index expressions of the expression-list are evaluated in order, from left to right. The result of

35processing the indexer access is an expression classified as an indexer access. The indexer access

36expression references the indexer determined in the step above, and has an associated instance

37expression of P and an associated argument list of A.

38Depending on the context in which it is used, an indexer access causes invocation of either the get-accessor

39or the set-accessor of the indexer. If the indexer access is the target of an assignment, the set-accessor is

40invoked to assign a new value (§14.13.1). In all other cases, the get-accessor is invoked to obtain the current

41value (§14.1.1).

4214.5.7 This access

43A this-access consists of the reserved word this.

44this-access:

45

this

168

Chapter 14 Expressions

1A this-access is permitted only in the block of an instance constructor, an instance method, or an instance

2accessor. It has one of the following meanings:

3When this is used in a primary-expression within an instance constructor of a class, it is classified as a

4value. The type of the value is the class within which the usage occurs, and the value is a reference to the

5object being constructed.

6When this is used in a primary-expression within an instance method or instance accessor of a class, it

7is classified as a value. The type of the value is the class within which the usage occurs, and the value is

8a reference to the object for which the method or accessor was invoked.

9When this is used in a primary-expression within an instance constructor of a struct, it is classified as a

10variable. The type of the variable is the struct within which the usage occurs, and the variable represents

11the struct being constructed. The this variable of an instance constructor of a struct behaves exactly the

12same as:

13o an out parameter of the struct type if the constructor declaration has no constructor initializer. In

14particular, this means that the variable shall be definitely assigned in every execution path of the

15instance constructor.

16o a ref parameter of the struct type if the constructor declaration has a constructor initializer. In

17particular, this means that the variable is considered initially assigned.

18When this is used in a primary-expression within an instance method or instance accessor of a struct, it

19is classified as a variable. The type of the variable is the struct within which the usage occurs, and the

20variable represents the struct for which the method or accessor was invoked. The this variable of an

21instance method of a struct behaves exactly the same as a ref parameter of the struct type.

22Use of this in a primary-expression in a context other than the ones listed above is a compile-time error. In

23particular, it is not possible to refer to this in a static method, a static property accessor, or in a variable-

24initializer of a field declaration.

2514.5.8 Base access

26A base-access consists of the reserved word base followed by either a “.” token and an identifier and

27optional type-argument-list or an expression-list enclosed in square brackets:

28base-access:

29

base .

identifier type-argument-listopt

30

base [

expression-list ]

31A base-access is used to access base class members that are hidden by similarly named members in the

32current class or struct. A base-access is permitted only in the block of an instance constructor, an instance

33method, or an instance accessor. When base.I occurs in a class or struct, I shall denote a member of the

34base class of that class or struct. Likewise, when base[E] occurs in a class, an applicable indexer shall exist

35in the base class.

36At compile-time, base-access expressions of the form base.I and base[E] are evaluated exactly as if they

37were written ((B)this).I and ((B)this)[E], where B is the base class of the class or struct in which

38the construct occurs. Thus, base.I and base[E] correspond to this.I and this[E], except this is

39viewed as an instance of the base class.

40When a base-access references a virtual function member (a method, property, or indexer), the

41determination of which function member to invoke at run-time (§14.4.3) is changed. The function member

42that is invoked is determined by finding the most derived implementation (§17.5.3) of the function member

43with respect to B (instead of with respect to the run-time type of this, as would be usual in a non-base

44access). Thus, within an override of a virtual function member, a base-access can be used to invoke the

45inherited implementation of the function member. If the function member referenced by a base-access is

46abstract, a compile-time error occurs.

169

C# LANGUAGE SPECIFICATION

114.5.9 Postfix increment and decrement operators

2post-increment-expression:

3

primary-expression

++

4

post-decrement-expression:

5

primary-expression

--

6The operand of a postfix increment or decrement operation shall be an expression classified as a variable, a

7property access, or an indexer access. The result of the operation is a value of the same type as the operand.

8If the operand of a postfix increment or decrement operation is a property or indexer access, the property or

9indexer shall have both a get and a set accessor. If this is not the case, a compile-time error occurs.

10Unary operator overload resolution (§14.2.3) is applied to select a specific operator implementation.

11Predefined ++ and -- operators exist for the following operand types: sbyte, byte, short, ushort, int,

12uint, long, ulong, char, float, double, decimal, and any enum type. The result type of each of these

13predefined operators is the same as the operand type. The predefined ++ operators return the value produced

14by adding 1 to the operand, and the predefined -- operators return the value produced by subtracting 1 from

15the operand. In a checked context, if the result of this addition or subtraction is outside the range of the

16result type, a System.OverflowException is thrown.

17There shall be an implicit conversion from the return type of the selected unary operator to the type of the

18primary-expression, otherwise a compile-time error occurs.

19The run-time processing of a postfix increment or decrement operation of the form x++ or x-- consists of

20the following steps:

21If x is classified as a variable:

22o x is evaluated to produce the variable.

23o The value of x is saved.

24o The saved value of x is converted to the operand type of the selected operator and the operator is

25invoked with this value as its argument.

26o The value returned by the operator is converted to the type of x and stored in the location given by

27the evaluation of x.

28o The saved value of x becomes the result of the operation.

29If x is classified as a property or indexer access:

30o The instance expression (if x is not static) and the argument list (if x is an indexer access)

31associated with x are evaluated, and the results are used in the subsequent get and set accessor

32invocations.

33o The get accessor of x is invoked and the returned value is saved.

34o The saved value of x is converted to the operand type of the selected operator and the operator is

35invoked with this value as its argument.

36o The value returned by the operator is converted to the type of x and the set accessor of x is invoked

37with this value as its value argument.

38o The saved value of x becomes the result of the operation.

39The ++ and -- operators also support prefix notation (§14.6.5). The result of x++ or x-- is the value of

40x before the operation, whereas the result of ++x or --x is the value of x after the operation. In either

41case, x itself has the same value after the operation.

42An operator ++ or operator -- implementation can be invoked using either postfix or prefix notation.

43It is not possible to have separate operator implementations for the two notations.

170

Соседние файлы в предмете Электротехника