分享
 
 
 

16.3 Using directives

王朝other·作者佚名  2006-05-06
窄屏简体版  字體: |||超大  

Using-directives facilitate the use of namespaces and types defined in other

namespaces. Using-directives

impact the name resolution process of namespace-or-type-names (§10.8) and

simple-names (§14.5.2), but

unlike declarations, using-directives do not contribute new members to the

underlying declaration spaces of

the compilation units or namespaces within which they are used.

Chapter 16 Namespaces

203

using-directives:

using-directive

using-directives using-directive

using-directive:

using-alias-directive

using-namespace-directive

A using-alias-directive (§16.3.1) introduces an alias for a namespace or

type.

A using-namespace-directive (§16.3.2) imports the type members of a

namespace.

The scope of a using-directive extends over the

namespace-member-declarations of its immediately

containing compilation unit or namespace body. The scope of a

using-directive specifically does not include

its peer using-directives. Thus, peer using-directives do not affect each

other, and the order in which they are

written is insignificant.

16.3.1 Using alias directives

A using-alias-directive introduces an identifier that serves as an alias

for a namespace or type within the

immediately enclosing compilation unit or namespace body.

using-alias-directive:

using identifier = namespace-or-type-name ;

Within member declarations in a compilation unit or namespace body that

contains a using-alias-directive,

the identifier introduced by the using-alias-directive can be used to

reference the given namespace or type.

[Example: For example:

namespace N1.N2

{

class A {}

}

namespace N3

{

using A = N1.N2.A;

class B: A {}

}

Above, within member declarations in the N3 namespace, A is an alias for

N1.N2.A, and thus class N3.B

derives from class N1.N2.A. The same effect can be obtained by creating an

alias R for N1.N2 and then

referencing R.A:

namespace N3

{

using R = N1.N2;

class B: R.A {}

}

end example]

The identifier of a using-alias-directive must be unique within the

declaration space of the compilation unit

or namespace that immediately contains the using-alias-directive. [Example:

For example:

namespace N3

{

class A {}

}

namespace N3

{

using A = N1.N2.A; // Error, A already exists

}

C# LANGUAGE SPECIFICATION

204

Above, N3 already contains a member A, so it is a compile-time error for a

using-alias-directive to use that

identifier. end example] Likewise, it is a compile-time error for two or

more using-alias-directives in the

same compilation unit or namespace body to declare aliases by the same name.

A using-alias-directive makes an alias available within a particular

compilation unit or namespace body, but

it does not contribute any new members to the underlying declaration space.

In other words, a using-aliasdirective

is not transitive, but, rather, affects only the compilation unit or

namespace body in which it occurs.

[Example: In the example

namespace N3

{

using R = N1.N2;

}

namespace N3

{

class B: R.A {} // Error, R unknown

}

the scope of the using-alias-directive that introduces R only extends to

member declarations in the

namespace body in which it is contained, so R is unknown in the second

namespace declaration. However,

placing the using-alias-directive in the containing compilation unit causes

the alias to become available

within both namespace declarations:

using R = N1.N2;

namespace N3

{

class B: R.A {}

}

namespace N3

{

class C: R.A {}

}

end example]

Just like regular members, names introduced by using-alias-directives are

hidden by similarly named

members in nested scopes. [Example: In the example

using R = N1.N2;

namespace N3

{

class R {}

class B: R.A {} // Error, R has no member A

}

the reference to R.A in the declaration of B causes a compile-time error

because R refers to N3.R, not

N1.N2. end example]

The order in which using-alias-directives are written has no significance,

and resolution of the namespaceor-

type-name referenced by a using-alias-directive is not affected by the

using-alias-directive itself or by

other using-directives in the immediately containing compilation unit or

namespace body. In other words,

the namespace-or-type-name of a using-alias-directive is resolved as if the

immediately containing

compilation unit or namespace body had no using-directives. [Example: In

the example

namespace N1.N2 {}

namespace N3

{

using R1 = N1; // OK

using R2 = N1.N2; // OK

using R3 = R1.N2; // Error, R1 unknown

}

Chapter 16 Namespaces

205

the last using-alias-directive results in a compile-time error because it

is not affected by the first using-aliasdirective.

end example]

A using-alias-directive can create an alias for any namespace or type,

including the namespace within which

it appears and any namespace or type nested within that namespace.

Accessing a namespace or type through an alias yields exactly the same

result as accessing that namespace

or type through its declared name. [Example: For example, given

namespace N1.N2

{

class A {}

}

namespace N3

{

using R1 = N1;

using R2 = N1.N2;

class B

{

N1.N2.A a; // refers to N1.N2.A

R1.N2.A b; // refers to N1.N2.A

R2.A c; // refers to N1.N2.A

}

}

the names N1.N2.A, R1.N2.A, and R2.A are equivalent and all refer to the

class whose fully qualified

name is N1.N2.A. end example]

16.3.2 Using namespace directives

A using-namespace-directive imports the types contained in a namespace into

the immediately enclosing

compilation unit or namespace body, enabling the identifier of each type to

be used without qualification.

using-namespace-directive:

using namespace-name ;

Within member declarations in a compilation unit or namespace body that

contains a using-namespacedirective,

the types contained in the given namespace can be referenced directly.

[Example: For example:

namespace N1.N2

{

class A {}

}

namespace N3

{

using N1.N2;

class B: A {}

}

Above, within member declarations in the N3 namespace, the type members of

N1.N2 are directly

available, and thus class N3.B derives from class N1.N2.A. end example]

A using-namespace-directive imports the types contained in the given

namespace, but specifically does not

import nested namespaces. [Example: In the example

namespace N1.N2

{

class A {}

}

namespace N3

{

using N1;

class B: N2.A {} // Error, N2 unknown

}

C# LANGUAGE SPECIFICATION

206

the using-namespace-directive imports the types contained in N1, but not

the namespaces nested in N1. Thus,

the reference to N2.A in the declaration of B results in a compile-time

error because no members named N2

are in scope. end example]

Unlike a using-alias-directive, a using-namespace-directive may import

types whose identifiers are already

defined within the enclosing compilation unit or namespace body. In effect,

names imported by a usingnamespace-

directive are hidden by similarly named members in the enclosing

compilation unit or

namespace body. [Example: For example:

namespace N1.N2

{

class A {}

class B {}

}

namespace N3

{

using N1.N2;

class A {}

}

Here, within member declarations in the N3 namespace, A refers to N3.A

rather than N1.N2.A. end example]

When more than one namespace imported by using-namespace-directives in the

same compilation unit or

namespace body contain types by the same name, references to that name are

considered ambiguous.

[Example: In the example

namespace N1

{

class A {}

}

namespace N2

{

class A {}

}

namespace N3

{

using N1;

using N2;

class B: A {} // Error, A is ambiguous

}

both N1 and N2 contain a member A, and because N3 imports both, referencing

A in N3 is a compile-time

error. end example] In this situation, the conflict can be resolved either

through qualification of references

to A, or by introducing a using-alias-directive that picks a particular A.

[Example: For example:

namespace N3

{

using N1;

using N2;

using A = N1.A;

class B: A {} // A means N1.A

}

end example]

Like a using-alias-directive, a using-namespace-directive does not

contribute any new members to the

underlying declaration space of the compilation unit or namespace, but,

rather, affects only the compilation

unit or namespace body in which it appears.

The namespace-name referenced by a using-namespace-directive is resolved in

the same way as the

namespace-or-type-name referenced by a using-alias-directive. Thus,

using-namespace-directives in the

same compilation unit or namespace body do not affect each other and can be

written in any order.

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有