欢迎光临散文网 会员登陆 & 注册

C# Spec烧脑章节Namespace and type names

2022-02-16 23:22 作者:澄不空  | 我要投稿

这一节太可怕了。冲冲冲。

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/basic-concepts#namespace-and-type-names

The meaning of a namespace_or_type_name is determined as follows:

  • If the namespace_or_type_name is a qualified_alias_member, the meaning is as specified in §13.8.1.

  • Otherwise, if the namespace_or_type_name is of the form I or of the form I<A₁, ..., Aₓ>:

    • If x is zero and I is the name of a namespace in N, then:

    • Otherwise, if N contains an accessible type having name I and x type parameters, then:

    • Otherwise, if the location where the namespace_or_type_name occurs is enclosed by a namespace declaration for N:

    • If the location where the namespace_or_type_name occurs is enclosed by a namespace declaration for N and the namespace declaration contains an extern_alias_directive or using_alias_directive that associates the name I with a namespace or type, then the namespace_or_type_name is ambiguous and a compile-time error occurs.

    • Otherwise, the namespace_or_type_name refers to the namespace named I in N.

    • If x is zero and the location where the namespace_or_type_name occurs is enclosed by a namespace declaration for N and the namespace declaration contains an extern_alias_directive or using_alias_directive that associates the name I with a namespace or type, then the namespace_or_type_name is ambiguous and a compile-time error occurs.

    • Otherwise, the namespace_or_type_name refers to the type constructed with the given type arguments.

    • If x is zero and the namespace declaration contains an extern_alias_directive or using_alias_directive that associates the name I with an imported namespace or type, then the namespace_or_type_name refers to that namespace or type.

    • Otherwise, if the namespaces imported by the using_namespace_directives of the namespace declaration contain exactly one type having name I and x type parameters, then the namespace_or_type_name refers to that type constructed with the given type arguments.

    • Otherwise, if the namespaces imported by the using_namespace_directives of the namespace declaration contain more than one type having name I and x type parameters, then the namespace_or_type_name is ambiguous and an error occurs.

    • If x is zero and the declaration of T includes a type parameter with name I, then the namespace_or_type_name refers to that type parameter.

    • Otherwise, if the namespace_or_type_name appears within the body of the type declaration, and T or any of its base types contain a nested accessible type having name I and x type parameters, then the namespace_or_type_name refers to that type constructed with the given type arguments. If there is more than one such type, the type declared within the more derived type is selected.

    • If x is zero and the namespace_or_type_name appears within a generic method declaration (§14.6) but outside the attributes of its method-header, and if that declaration includes a type parameter (§14.2.3) with name I, then the namespace_or_type_name refers to that type parameter.

    • Otherwise, if the namespace_or_type_name appears within a type declaration, then for each instance type T (§14.3.2), starting with the instance type of that type declaration and continuing with the instance type of each enclosing class or struct declaration (if any):

      Note: Non-type members (constants, fields, methods, properties, indexers, operators, instance constructors, finalizers, and static constructors) and type members with a different number of type parameters are ignored when determining the meaning of the namespace_or_type_name. end note

    • Otherwise, for each namespace N, starting with the namespace in which the namespace_or_type_name occurs, continuing with each enclosing namespace (if any), and ending with the global namespace, the following steps are evaluated until an entity is located:

    • Otherwise, the namespace_or_type_name is undefined and a compile-time error occurs.

    • Otherwise, the namespace_or_type_name is of the form N.I or of the form N.I<A₁, ..., Aₓ>N is first resolved as a namespace_or_type_name. If the resolution of N is not successful, a compile-time error occurs. Otherwise, N.I or N.I<A₁, ..., Aₓ> is resolved as follows:

      • If x is zero and N refers to a namespace and N contains a nested namespace with name I, then the namespace_or_type_name refers to that nested namespace.

      • Otherwise, if N refers to a namespace and N contains an accessible type having name I and x type parameters, then the namespace_or_type_name refers to that type constructed with the given type arguments.

      • Otherwise, if N refers to a (possibly constructed) class or struct type and N or any of its base classes contain a nested accessible type having name I and x type parameters, then the namespace_or_type_name refers to that type constructed with the given type arguments. If there is more than one such type, the type declared within the more derived type is selected.

        Note: If the meaning of N.I is being determined as part of resolving the base class specification of N then the direct base class of N is considered to be object (§14.2.4.2). end note

      • Otherwise, N.I is an invalid namespace_or_type_name, and a compile-time error occurs.


    C# Spec烧脑章节Namespace and type names的评论 (共 条)

    分享到微博请遵守国家法律