国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 開發(fā) > 綜合 > 正文

C# 2.0 Specification(泛型六)

2024-07-21 02:20:09
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
接泛型五
20.8表達(dá)式和語(yǔ)句
某些表達(dá)式和語(yǔ)句的操作針對(duì)泛型進(jìn)行了修改。這一節(jié)將介紹這些改變。
20.8.1默認(rèn)值表達(dá)式
默認(rèn)值表達(dá)式被用于獲得一個(gè)類型的默認(rèn)值(§5.2)。通常一個(gè)默認(rèn)值表達(dá)式被用于類型參數(shù),因?yàn)槿绻愋蛥?shù)的是一個(gè)值類型或引用類型,它可能不是已經(jīng)的。(不存在從null類型到類型參數(shù)的轉(zhuǎn)換。)
primary-no-array-creation-expression:(基本無(wú)數(shù)組創(chuàng)建表達(dá)式:)

default-value-expression(默認(rèn)值表達(dá)式)
default-value-expression:(默認(rèn)值表達(dá)式:)
primary-expression . default (基本表達(dá)式 .default)
predefined-type . default(預(yù)定義類型. default)
如果一個(gè)基本表達(dá)式在一個(gè)默認(rèn)值表達(dá)式中被使用,并且這個(gè)基本表達(dá)式不能分為一個(gè)類型,那么將會(huì)出現(xiàn)一個(gè)編譯時(shí)錯(cuò)誤。然而在§7.5.4.1中描述的規(guī)則也適用于形成e.default的構(gòu)件。
如果默認(rèn)值表達(dá)式的左邊針對(duì)一個(gè)引用類型在運(yùn)行時(shí)被計(jì)算,結(jié)果是將null轉(zhuǎn)換到那個(gè)類型。如果默認(rèn)值表達(dá)式的左邊針對(duì)一個(gè)值類型在運(yùn)行時(shí)被計(jì)算,其結(jié)果是值類型的默認(rèn)值(§4.1.2)。
如果類型是一個(gè)具有類約束的引用類型或類型參數(shù),默認(rèn)值表達(dá)式是一個(gè)常量表達(dá)式(§7.15)。此外,如果類型是下列值之一,默認(rèn)值表達(dá)式是一個(gè)常量表達(dá)式:sbyte、byte、 short、ushort、 int 、 uint 、long 、ulong 、 char 、float 、double 、decimal 或bool。
20.8.2對(duì)象創(chuàng)建表達(dá)式
對(duì)象常見表達(dá)式的類型可以是一個(gè)類型參數(shù)。當(dāng)類型參數(shù)被作為對(duì)象創(chuàng)建表達(dá)式中的類型而指定時(shí),下面兩個(gè)條件必須具備,否則將會(huì)出現(xiàn)編譯時(shí)錯(cuò)誤
實(shí)參列表必須刪除
必須為類型參數(shù)而指定new()形式的構(gòu)造函數(shù)約束


通過(guò)創(chuàng)建一個(gè)類型參數(shù)被綁定到的運(yùn)行時(shí)類型的實(shí)例,并調(diào)用該類型的默認(rèn)構(gòu)造函數(shù),就可以執(zhí)行對(duì)象創(chuàng)建表達(dá)式。運(yùn)行時(shí)類型可以是引用或者值類型。
20.8.3運(yùn)算符的類型
typeof運(yùn)算符可以用于類型參數(shù)。其結(jié)果是被綁定到類型參數(shù)的運(yùn)行時(shí)類型的system.type對(duì)象。typeof運(yùn)算符也可以被用于構(gòu)造類型。
class x <t>
{
public static void printtypes()
{
console.writeline(typeof(t).fullname);
console.writeline(typeof(x<x<t>>).fullname);
}
}
class m
{
static void main()
{
x<int>.printtypes();
}
}
先前的程序?qū)⒋蛴∪缦隆?br>system.int32
x<x<sytem.int32>>
typeof運(yùn)算符不能用于沒有指定類型實(shí)參的泛型類型聲明的名字。
class x<t>{…}
class m
{
static void main()
{
type t = typeof(x); //錯(cuò)誤,x需要類型實(shí)參
}
}
20.8.4引用相等運(yùn)算符
如果t由一個(gè)類約束而約束,引用類型相等運(yùn)算符可以被用于比較類型參數(shù)t的值。
引用類型相等運(yùn)算符的用法可以讓類型參數(shù)t的實(shí)參很容易地與其他為null的實(shí)參進(jìn)行比較,即使t沒有類約束也如此。在運(yùn)行時(shí),如果t是一個(gè)值類型,比較的結(jié)果將是false。


下面的例子檢查一個(gè)非約束類型參數(shù)類型的實(shí)參是否是null。
class c<t>
{
void f(t x)
{
if(x==null) thow new argumentnullexception();

}
}

即使是t可以表示一個(gè)值類型,x==null構(gòu)件也是允許的,并且當(dāng)t是值類型時(shí),其結(jié)果被簡(jiǎn)單的定義為false。
20.8.5 is運(yùn)算符
在開放類型上的is運(yùn)算符操作遵循通常的規(guī)則(§7.9.9)。如果e或t的編譯時(shí)類型是一個(gè)開放類型,那么在運(yùn)行時(shí)對(duì)于e和t將總是執(zhí)行動(dòng)態(tài)類型檢查。
20.8.6as運(yùn)算符
只要t有一個(gè)類約束,類型參數(shù)t可被用在as運(yùn)算符的右邊。這種限制是需要的,因?yàn)橹祅ull可能被作為運(yùn)算符的結(jié)果返回。
class x
{
public t f<t>(object o) where t:attribute
{
return o as t; //ok,t有一個(gè)類約束
}
public t g<t>(object o)
{
return o as t; //錯(cuò)誤,t沒有約束
}
}
在as運(yùn)算符(§7.9.10)的當(dāng)前規(guī)范中,對(duì)于表達(dá)式e as t最后一點(diǎn)表明,如果從e的編譯時(shí)類型到t,不存在有效的顯式引用轉(zhuǎn)換,將會(huì)出現(xiàn)編譯時(shí)錯(cuò)誤。對(duì)于泛型,這條規(guī)則稍微作了修改。如果e的編譯時(shí)類型或t是一個(gè)開放類型,在這種情況下將不會(huì)出現(xiàn)編譯時(shí)錯(cuò)誤;相反,運(yùn)行時(shí)檢查將會(huì)執(zhí)行。

20.8.7異常語(yǔ)句
對(duì)于開放類型,throw(§8.9.5)和try(§8.10)的通常規(guī)則是適用的。


只要類型參數(shù)具有system.exeption異常(或子類具有)作為類約束,那么throw語(yǔ)句可以被用作其類型有一個(gè)類型參數(shù)給定的表達(dá)式。
只要類型參數(shù)system.exception(或子類子類具有)作為類約束,那么在catch語(yǔ)句中的命名的類型可能是一個(gè)類型參數(shù)。

20.8.8 lock語(yǔ)句
lock語(yǔ)句可以被用作其類型由一個(gè)類型參數(shù)給定的表達(dá)式。如果表達(dá)式的運(yùn)行時(shí)類型是一個(gè)值類型,lock將沒有效果(因?yàn)閷?duì)于裝箱值不能有任何其他的引用)。
20.8.9 using 語(yǔ)句
using 語(yǔ)句(§8.13)遵循通常的規(guī)則:表達(dá)式必須被隱式的轉(zhuǎn)換到system.idisposable。如果類型參數(shù)通過(guò)system.idisposable而約束,那么該類型的表達(dá)式可以使用using 語(yǔ)句。
20.8.10 foreach語(yǔ)句
給定如下形式的foreach語(yǔ)句
foreach(elementtype element in collection) statement
如果集合表達(dá)式是一個(gè)沒有實(shí)現(xiàn)集合模式的類型,但為每個(gè)類型t實(shí)現(xiàn)了構(gòu)造接口system.collections.generic.ienumerable<t>,那么foreach語(yǔ)句的擴(kuò)展是
ienumerator<t> enumerator = ((ienuemrable<t>)(collection).getenumerator();
try
{
where (enumerator.movenext()){
elementtype element = (elementtype)enumerator.current;
statement;
}
}
finally{
enumerator.dispose();
}

20.9查找規(guī)則修訂
泛型修改了用于查找和綁定名字的某些基本規(guī)則。下面幾節(jié)在考慮泛型的情況下,重新敘述了所有的基本名字查找規(guī)則。


20.9.1命名空間和類型名字
如下內(nèi)容可替換§3.8。
在c#程序中有幾個(gè)上下文需要指定命名空間或者類型名字。任何形式的名字都可以由一個(gè)或多個(gè)由“.”標(biāo)記分隔的標(biāo)識(shí)符號(hào)組成。
namespace-name:(命名空間名字:)
namespace-or-type-name(命名空間或類型名字)
type-name:(類型名字:)
namespace-or-type-name(命名空間或類型名字)
namespace-or-type-name:(命名空間或類型名字:)
identifier type-argument-list opt(標(biāo)識(shí)符 類型實(shí)參列表可選)
namespace-or-type-name . identifier type-argument-list opt( 命名空間或類型名字. 標(biāo)識(shí)符 類型實(shí)參列表可選)
命名空間名字是引用命名空間的命名空間名字或類型名字(namespace-or-type-name)。見下面所描述的決策,命名空間名字的命名空間或類型名字必須引用一個(gè)命名空間,否則出現(xiàn)編譯時(shí)錯(cuò)誤。在一個(gè)命名空間名字中不能有類型實(shí)參(只有類型可以具有類型實(shí)參)。
類型名字是一個(gè)引用類型的命名空間或類型名字(namespace-or-type-name)。見下面所描述的決策,類型名字的命名空間或類型名字必須引用一個(gè)類型,否則出現(xiàn)編譯時(shí)錯(cuò)誤。
命名空間或類型名字的意義按如下確定。
如果命名空間或類型名字是i或i<a1,…,an>的形式,其中i 是一個(gè)單一標(biāo)識(shí)符,并且<a1,…,an>是一個(gè)可選類型實(shí)參列表。
- 如果命名空間或類型名字出現(xiàn)在泛型方法聲明之內(nèi),并且該聲明包括一個(gè)由i給定名字的沒有指定類型實(shí)參列表的類型參數(shù),那么命名空間或類型名字引用該類型參數(shù)。
- 否則,如果命名空間或類型名字出現(xiàn)在類型聲明之內(nèi),那么對(duì)于類型t的每個(gè)實(shí)例(<a1,…,an>20.1.2),以那個(gè)類型聲明的實(shí)例類型開始,并繼續(xù)采用每個(gè)封閉類或結(jié)構(gòu)類型聲明(如果有的話)
u 如果沒有指定包含由i給定名字,并且沒有類型實(shí)參列表的類型參數(shù)t的聲明,那么命名空間或類型名字引用那個(gè)類型參數(shù)。



u 否則,如果i是t中可訪問成員的名字,并且如果那個(gè)成員是一個(gè)帶有匹配類型參數(shù)數(shù)量的類型,那么命名空間或類型名字引用類型t.i或者類型t.i<a1,…an>。注意當(dāng)確定命名空間或類型名字的意義時(shí),無(wú)類型成員(常數(shù)、字段、方法、屬性、索引器、運(yùn)算符、實(shí)例構(gòu)造函數(shù)、析構(gòu)函數(shù)和靜態(tài)構(gòu)造函數(shù))和帶有不同數(shù)量的類型參數(shù)成員將會(huì)被忽略。
- 否則,對(duì)于在以命名空間或類型名字出現(xiàn)的命名空間開始的每個(gè)命名空間n,并繼續(xù)使用每個(gè)封閉命名空間(如果有的話),然后以全局命名空間結(jié)束,下面的步驟將會(huì)被計(jì)算,直到該實(shí)體被定位。
u 如果i 是在n中的命名空間中的名字,并且沒有指定類型實(shí)參列表,那么命名空間或類型名字引用該個(gè)命名空間。
u 否則,如果i是在n中帶有匹配類型參數(shù)數(shù)量的可訪問類型的名字,那么命名空間或類型名字引用使用給定類型實(shí)參構(gòu)造的類型。
u 否則,如果命名空間或類型名字出現(xiàn)的位置,由n的命名空間聲明所封閉
- 如果命名空間聲明包含一個(gè)由i 給定名字的using 別名指令,而i帶有導(dǎo)入命名空間或類型,并且沒有指定參數(shù)列表,那么命名空間或類型名字引用該命名空間或者類型
- 否則,如果由命名空間聲明的using命名空間指示符導(dǎo)入的命名空間,恰好包含帶有i 給定名字的,匹配類型參數(shù)數(shù)量的類型,那么命名空間或類型名字引用由給定類型實(shí)參構(gòu)造的這個(gè)類型。
- 否則,如果由命名空間聲明的using 命名空間指示符導(dǎo)入的命名空間包含多個(gè)帶有i給定名字的,匹配類型參數(shù)數(shù)量的類型,那么命名空間或者類型名字是模糊的,并且將導(dǎo)致錯(cuò)誤。
- 否則,命名空間或類型名字是未定義的,并且出現(xiàn)編譯時(shí)錯(cuò)誤。



l 否則,命名空間或者類型名字是n.i或者n.i<a1,…,an>的形式,這里n是一個(gè)命名空間或類型名字,i是一個(gè)標(biāo)識(shí)符,并且<a1,…,an>是一個(gè)可選類型實(shí)參列表。n 被作為命名空間或類型名字而首先決策。如果n的決策失敗,將會(huì)出現(xiàn)一個(gè)編譯時(shí)錯(cuò)誤。否則n.i或者n.i<a1,…,an>將按如下方式?jīng)Q策。
- 如果n引用一個(gè)命名空間,并且如果i是內(nèi)嵌在n中的命名空間名字,并且沒有指定類型實(shí)參列表,那么命名空間或類型名字引用該內(nèi)嵌命名空間。
- 否則,如果n引用一個(gè)命名空間,并且i是在帶有匹配類型參數(shù)數(shù)量的n中的可訪問類型的名字,那么命名空間或類型名字引用由給定類型實(shí)參構(gòu)造的那個(gè)類型。
- 否則,如果n引用類或結(jié)構(gòu)類型,并且i是內(nèi)嵌在帶有與類型參數(shù)匹配的n中的可訪問類型的名字,那么命名空間或者類型名字引用由給定實(shí)參構(gòu)造的那個(gè)類型。
- 否則,n.i是一個(gè)無(wú)效的命名空間名字,并且會(huì)出現(xiàn)編譯時(shí)錯(cuò)誤。

20.9.2成員查找
下面內(nèi)容可替換§7.3

成員查找是一種根據(jù)在上下文中的意義來(lái)確定類型的處理過(guò)程。在一個(gè)表達(dá)式中,成員查找可以作為計(jì)算一個(gè)簡(jiǎn)單名字或成員訪問(§20.9.4)而出現(xiàn)。
在類型t中的名字n的成員查找按如下規(guī)則確定。
首先一組名為n的可訪問成員被確定。
- 如果t是一個(gè)類型參數(shù),那么在每個(gè)作為t的類約束或接口約束而指定的類型,連同在object中的n的命名成員的集合中,這個(gè)集合就是命名的可訪問成員的聯(lián)合。
- 否則,這個(gè)集合由t中的n的所有命名可訪問成員組成,包括繼承成員和在object中的n的命名可訪問成員。如果t 是一個(gè)構(gòu)造類型,成員的集合通過(guò)替換§20.5.4中描述的類型實(shí)參而得到。包括override修飾符的成員將從集合中排出。




接著,通過(guò)其他成員而被隱藏的成員將從這個(gè)集合中刪除。對(duì)于在集合中的每個(gè)成員s.m,s是m在其中被聲明的類型,下面的規(guī)則可適用
- 如果m是一個(gè)常數(shù)、字段、屬性、事件或枚舉成員,那么在s的所有基類中聲明的成員都將從這個(gè)集合刪除。
- 如果m是一個(gè)類型聲明,那么在 s基類中的所有非類型聲明都從集合被刪除,并且,作為s 在基類型中聲明的m的所有帶有相同數(shù)量類型參數(shù)的類型聲明,都將從該集合中刪除。
- 如果m是一個(gè)方法,那么在s的基類中聲明的所有非方法成員,都將從這個(gè)集合刪除,并且,作為s 在基類型中聲明的m的帶有相同簽名的所有方法都將從這個(gè)集合中刪除。
接著,通過(guò)類成員隱藏的接口成員將從該集合中刪除。這一步,只有當(dāng)t是一個(gè)類型參數(shù),并且t有類約束和多個(gè)接口約束時(shí)才有效。對(duì)于在集合中的每個(gè)成員s.m,其中s是m在其中聲明的類型,如果s是一個(gè)類聲明而不是object的話,下面的規(guī)則適用
- 如果m是一個(gè)常數(shù)、字段、屬性、事件、枚舉成員或類型聲明,那么在接口聲明中聲明的所有成員都將從這個(gè)集合中刪除。
- 如果m是一個(gè)方法,那么在接口類型中聲明的所有非方法成員都將從這個(gè)集合中刪除,并且,作為s 在接口中聲明的m的帶有相同簽名的所有方法都將從這個(gè)集合中刪除。
最后,在刪除隱藏成員之后,查找的結(jié)果將被確定
- 如果由單一成員組成的集合,不是類型、方法,那么這個(gè)成員就是查找的結(jié)果。
- 否則,如果集合只包含方法,那么這組方法就是查找的結(jié)果。
- 否則,如果集合只包含類型聲明,那么這組類型聲明在成員查找的結(jié)果中。
- 否則,查找是不明確的,將會(huì)出現(xiàn)編譯時(shí)錯(cuò)誤。
對(duì)于類型,而不是類型參數(shù)和接口的成員查找來(lái)說(shuō),在接口中的成員查找是嚴(yán)格的單繼承(在繼承鏈中的每個(gè)接口恰好有零個(gè)或一個(gè)直接基接口),查找規(guī)則的影響只是派生成員隱藏帶有相同名字和簽名的基類成員。這種單繼承查找是很明確的。成員查找中可能引起的模糊性來(lái)自于§13.2.5中描述的多重繼承接口


20.9.3簡(jiǎn)單名字
如下內(nèi)容可替換§7.5.2。
簡(jiǎn)單名字由一個(gè)標(biāo)識(shí)符,其后可跟隨可選的類型參數(shù)列表。
simple-name:(簡(jiǎn)單名字:)
identifier type-argument-list opt(標(biāo)識(shí)符 類型實(shí)參列表可選)
對(duì)于i或i<a1,…,an>形式的簡(jiǎn)單名字,這里i 是一個(gè)標(biāo)識(shí)符,i<a1,…,an>是一個(gè)可選類型實(shí)參列表,可以被按如下方式計(jì)算和分類。
如果簡(jiǎn)單名字出現(xiàn)在塊內(nèi),并且如果塊的局部變量聲明空間包含由i給定名字的局部變量或參數(shù),那么,這個(gè)簡(jiǎn)單名字引用該局部變量和參數(shù),并且作為一個(gè)變量而被分類。如果類型實(shí)參列表被指定,將會(huì)出現(xiàn)編譯時(shí)錯(cuò)誤。
如果簡(jiǎn)單名字出現(xiàn)在泛型方法聲明體之內(nèi),并且如果該聲明包含由i給定名字的類型參數(shù),那么簡(jiǎn)單名字引用那個(gè)類型參數(shù),如果只定了類型實(shí)參列表被,將會(huì)出現(xiàn)編譯時(shí)錯(cuò)誤。
否則,對(duì)于以直接封閉類、結(jié)構(gòu)或枚舉聲明的實(shí)例類型開始的類型t的每個(gè)實(shí)例,繼續(xù)采用每個(gè)封閉外部類或結(jié)構(gòu)聲明的實(shí)例類型(如果有的話)。
- 如果t的聲明包括由 i給定名字的類型參數(shù),那么,簡(jiǎn)單名字引用該類型參數(shù)。如果類型實(shí)參列表被指定,將會(huì)出現(xiàn)編譯時(shí)錯(cuò)誤。
- 否則,如果在t 中i的成員查找產(chǎn)生一個(gè)匹配
u 如果t是直接封閉類或結(jié)構(gòu)類型的實(shí)例類型, 并且查找標(biāo)識(shí)一個(gè)或多個(gè)方法,結(jié)果將是一個(gè)帶有與this表達(dá)式關(guān)聯(lián)的方法組。如果類型實(shí)參列表被指定,它被用在一個(gè)泛型方法調(diào)用中(§20.6.3)。
u 如果t是直接封閉類或結(jié)構(gòu)類型的實(shí)例類型,如果查找標(biāo)識(shí)一個(gè)實(shí)例成員,并且引用出現(xiàn)在一個(gè)實(shí)例構(gòu)造函數(shù)、實(shí)例方法或一個(gè)實(shí)例訪問器的塊之內(nèi),其結(jié)果將和this.i形式的成員訪問相似。如果類型實(shí)參被指定,將出現(xiàn)編譯時(shí)錯(cuò)誤。
u 否則,結(jié)果與t.i或t.i<a1,…,an>形式的成員訪問相似。在這種情況下,引用實(shí)例成員的簡(jiǎn)單名字將是一個(gè)編譯時(shí)錯(cuò)誤。



否則,對(duì)于帶有每個(gè)簡(jiǎn)單名字出現(xiàn)在其中的命名空間的命名空間n,繼續(xù)采用每個(gè)封閉命名空間(如果有的話),并以全局命名空間結(jié)束,下面的步驟將被計(jì)算,直到一個(gè)實(shí)體被定位。
- 如果i是在n 中的一個(gè)命名空間的名字,并且沒有指定類型實(shí)參列表,那么簡(jiǎn)單名字將引用該命名空間。
- 否則,如果i是在帶有匹配類型參數(shù)數(shù)量的n中的一個(gè)可訪問類型的名字,那么簡(jiǎn)單類型引用由給定類型實(shí)參構(gòu)造的那個(gè)類型。
u 如果命名空間聲明包含一個(gè)關(guān)聯(lián)由i給定名字的using 別名指令,這里i是一個(gè)導(dǎo)入命名空間或類型,并且沒有指定類型實(shí)參列表,那么簡(jiǎn)單名字引用該命名空間或類型。
u 否則,如果由命名空間聲明的using 命名空間指令導(dǎo)入的命名空間,恰好包含一個(gè)由i給定名字的,匹配類型參數(shù)數(shù)量的類型,那么簡(jiǎn)單名字引用由給定類型實(shí)參構(gòu)造的類型。
u 否則,如果由命名空間聲明的using命名空間指令導(dǎo)入的命名空間,包含多個(gè)由i給定名字,匹配類型參數(shù)數(shù)量的類型,那么簡(jiǎn)單名字是不明確的,將導(dǎo)致編譯時(shí)錯(cuò)誤
l 否則,由簡(jiǎn)單名字給定的名字是未定義的,將導(dǎo)致編譯時(shí)錯(cuò)誤。

20.9.4成員訪問
如下內(nèi)容可代替§7.5.4。
成員訪問由基本表達(dá)式或預(yù)定義類型,緊接一個(gè)“.”標(biāo)記,再緊接一個(gè)標(biāo)識(shí)符,然后接著可選的類型實(shí)參列表而組成。
member-access:(成員訪問:)
primary-expression . identifier type-argument-list opt(基本表達(dá)式. 標(biāo)識(shí)符 類型實(shí)參列表可選)
predefined-type . identifier type-argument-list opt(預(yù)定義類型. 標(biāo)識(shí)符 類型實(shí)參列表可選)預(yù)定義類型:下列之一
bool byte char decimal double float int long
object sbyte short string uint ulong ushort


對(duì)于e.i或e.i<a1,…,an>形式的成員訪問,這里e是一個(gè)基本表達(dá)式或預(yù)定義類型,i是一個(gè)標(biāo)識(shí)符,并且<a1,…,an>是一個(gè)可選類型實(shí)參列表,將按如下方式被計(jì)算和分類。
如果e 是一個(gè)命名空間,i是e 中嵌套命名空間的名字,并且沒有指定類型實(shí)參,那么結(jié)果就是這個(gè)命名空間。
如果e是一個(gè)命名空間,i是在e中可訪問類型的名字,e 匹配類型參數(shù)的數(shù)量,那么結(jié)果就是由給定類型實(shí)參構(gòu)造的類型。
如果e是一個(gè)預(yù)定義類型或作為一個(gè)類型而被分類的基本表達(dá)式,如果e 不是類型參數(shù),并且如果在e中i的成員查找產(chǎn)生一個(gè)匹配,那么e.i被計(jì)算,并按如下分類。
- 如果i標(biāo)識(shí)一個(gè)或多個(gè)類型聲明,那么使用相同數(shù)量的(可能是零)類型參數(shù)來(lái)確定該類型聲明,就像是在類型實(shí)參中提供的那樣。結(jié)果就是由給定類型實(shí)參而構(gòu)造的類型。如果類型聲明不匹配類型參數(shù)的數(shù)量,將出現(xiàn)編譯時(shí)錯(cuò)誤。
- 如果i標(biāo)識(shí)一個(gè)或多個(gè)方法,那么結(jié)果是沒有關(guān)聯(lián)實(shí)例表達(dá)式的方法組。如果類型實(shí)參列表被指定,它將在泛型方法調(diào)用中被使用(§20.6.3)。
- 如果i 標(biāo)識(shí)一個(gè)靜態(tài)屬性、靜態(tài)字段、靜態(tài)事件、常數(shù)或一個(gè)枚舉成員,并且如果類型實(shí)參列表被指定,將出現(xiàn)編譯時(shí)錯(cuò)誤。
- 如果i標(biāo)識(shí)一個(gè)靜態(tài)屬性,那么結(jié)果是帶有無(wú)關(guān)聯(lián)實(shí)例表達(dá)式的屬性訪問。
- 如果i標(biāo)識(shí)一個(gè)靜態(tài)字段
u 如果字段是只讀的,并且引用發(fā)生在類或結(jié)構(gòu)的靜態(tài)構(gòu)造函數(shù)之外,字段將在這里被聲明。那么結(jié)果是一個(gè)值,也就是在e中靜態(tài)字段i的值。
u 否則,結(jié)果是一個(gè)變量,也就是在e中的靜態(tài)字段i。
- 如果i標(biāo)識(shí)一個(gè)靜態(tài)事件
u 如果引用發(fā)生在事件被聲明的類或者結(jié)構(gòu)中,并且事件被聲明時(shí)沒有使用事件訪問器聲明(event-accessor-declaration)(§10.7),那么e.i就好像i是一個(gè)靜態(tài)字段一樣被處理。
u 否則,結(jié)果是一個(gè)無(wú)關(guān)聯(lián)的實(shí)例表達(dá)式的事件訪問。
- 如果i標(biāo)識(shí)一個(gè)常數(shù),那么結(jié)果是值,也就是常數(shù)的值。


- 如果i標(biāo)識(shí)一個(gè)枚舉成員,那么結(jié)果是一個(gè)值,也就是枚舉成員的值。
- 否則,e.i是一個(gè)無(wú)效成員引用,并將導(dǎo)致編譯時(shí)錯(cuò)誤。

如果e是一個(gè)屬性訪問、索引器訪問、變量或值,其類型是t,并且在t中i的成員查找產(chǎn)生一個(gè)匹配,那么e.i按如下方式被計(jì)算和分類。
- 首先,如果e是一個(gè)屬性或索引器訪問,那么屬性或索引器訪問的值將被獲得(§7.1.1),并且e被重分類為值。
- 如果i標(biāo)識(shí)一個(gè)或多個(gè)方法,那么結(jié)果是一個(gè)帶有關(guān)聯(lián)的e的實(shí)例表達(dá)式的方法組。如果類型實(shí)參列表被指定,它將在泛型方法調(diào)用中被使用(§20.6.3)。
- 如果i標(biāo)識(shí)一個(gè)實(shí)例屬性、實(shí)例字段或?qū)嵗录⑶胰绻愋蛯?shí)參列表被指定,將產(chǎn)生編譯時(shí)錯(cuò)誤。
- 如果i標(biāo)識(shí)一個(gè)實(shí)例屬性,那么結(jié)果是一個(gè)帶有關(guān)聯(lián)的e 的實(shí)例表達(dá)式。
- 如果t是一個(gè)類類型并且i 標(biāo)識(shí)一個(gè)類類型的實(shí)例字段
u 如果e的值是null,那么將會(huì)拋出system.nullreferenceexception。
u 否則,如果該字段是只讀的,并且引用出現(xiàn)在字段聲明的類的實(shí)例構(gòu)造函數(shù)之外,那么結(jié)果是值,也就是由e引用的對(duì)象中 i的值。
u 否則,結(jié)果是變量,也就是由e引用的對(duì)象中字段i。
- 如果t是一個(gè)結(jié)構(gòu)類型,并且i 標(biāo)識(shí)該結(jié)構(gòu)類型的實(shí)例字段
u 如果e是一個(gè)值,或者如果字段是只讀的,并且引用出現(xiàn)在字段聲明的結(jié)構(gòu)的實(shí)例構(gòu)造函數(shù)之外,那么結(jié)果是一個(gè)值,也就是由e給定的結(jié)構(gòu)實(shí)例中字段i的值。
u 否則,結(jié)果是一個(gè)變量,也就是由e給定結(jié)構(gòu)實(shí)例中的字段i;
- 如果i標(biāo)識(shí)一個(gè)實(shí)例事件
u 如果引用出現(xiàn)在該事件被聲明的類或結(jié)構(gòu)之內(nèi),并且事件被聲明時(shí)沒有使用事件訪問器聲明,那么e.i就好像i是一個(gè)實(shí)例字段一樣被處理。
u 否則,結(jié)果是一個(gè)帶有關(guān)聯(lián)的e的實(shí)例表達(dá)式。
否則,e.i是一個(gè)無(wú)效成員引用,將導(dǎo)致編譯時(shí)錯(cuò)誤。



20.9.5方法調(diào)用
如下內(nèi)容可替換§7.5.5.1中描述方法調(diào)用的編譯時(shí)處理部分。
對(duì)于m(a)形式的方法調(diào)用的編譯時(shí)處理,其中m是一個(gè)方法組(可能包含一個(gè)類型實(shí)參列表),a是可選實(shí)參列表,由如下步驟組成。
方法調(diào)用的候選集合被構(gòu)造。對(duì)于每個(gè)與方法組m關(guān)聯(lián)的方法f
- 如果f是非泛型的,當(dāng)如下成立時(shí)f是候選項(xiàng)
u m沒有類型實(shí)參列表,并且
u 對(duì)于a(§7.4.2.1) ,f是適用的。
- 如果f是泛型,并且m沒有類型實(shí)參列表,當(dāng)如下成立時(shí),f是候選項(xiàng)
u 類型推斷成功(§20.6.4),對(duì)于調(diào)用推斷出類型實(shí)參的列表,并且
u 一旦推斷的類型實(shí)參替換了對(duì)應(yīng)方法類型參數(shù),f的參數(shù)列表對(duì)于a是適用的,并且
u 在替換類型實(shí)參后,f 的參數(shù)列表,與適用的可能以其擴(kuò)展形式(§7.4.2.1)在相同的類型中作為f而聲明的非泛型方法是不同的。
- 如果f是泛型,并且m包括一個(gè)類型實(shí)參列表,當(dāng)如下成立時(shí),f是候選項(xiàng)
u f和在類型實(shí)參列表中提供的一樣,具有相同數(shù)量的方法類型參數(shù),并且
u 一旦,類型實(shí)參替換對(duì)應(yīng)的方法類型參數(shù),f的參數(shù)列表對(duì)于a 是可適用的(§7.4.2.1)。
候選方法的集合被縮減到只包含從深度派生類型而來(lái)的方法:對(duì)于在集合中的每個(gè)c.f方法,c是f在其中聲明的類型,在c的基類型中聲明的所有方法都被從集合中刪除。
如果候選方法的結(jié)果集合是空的,那么沒有可適用的方法存在,并且會(huì)出現(xiàn)編譯時(shí)錯(cuò)誤。如果候選方法并不是在同一類型中聲明的,方法調(diào)用將是不明確的,并且會(huì)出現(xiàn)編譯時(shí)錯(cuò)誤(這后一種情況,只可能出現(xiàn)在對(duì)于一個(gè)在具有多重直接基接口的接口中的方法的調(diào)用,如§13.2.5的描述)。




候選方法集合的最佳方法使用重載決策規(guī)則(§7.4.2)標(biāo)識(shí)。如果一個(gè)單一的最佳方法不能被標(biāo)識(shí),該方法調(diào)用是不明確的,并產(chǎn)生編譯時(shí)錯(cuò)誤。當(dāng)執(zhí)行重載決策時(shí),泛型方法的參數(shù)在將對(duì)應(yīng)的方法類型參數(shù)替換為類型實(shí)參(提供的或推斷的)之后將被考慮。
被選擇的最佳方法的最后驗(yàn)證被執(zhí)行
- 方法在方法組的上下文中是有效的:如果方法是一個(gè)靜態(tài)方法,方法組必須通過(guò)類型源自于簡(jiǎn)單名字或成員訪問。如果該最佳方法是一個(gè)實(shí)例方法,方法組必須通過(guò)一個(gè)變量或值或者基類訪問(base-access)源自于簡(jiǎn)單名字或成員訪問。如果這些需求都不滿足,那么將會(huì)出現(xiàn)編譯時(shí)錯(cuò)誤。
- 如果該最佳方法是一個(gè)泛型方法,類型實(shí)參(提供的或推斷的)將被針對(duì)聲明在泛型方法之上的約束作出檢查。如果任何類型實(shí)參不滿足對(duì)應(yīng)類型參數(shù)的約束,將產(chǎn)生一個(gè)編譯時(shí)錯(cuò)誤。
一旦方法根據(jù)前面的步驟被選擇和驗(yàn)證,實(shí)際的運(yùn)行時(shí)調(diào)用將根據(jù)§7.4.中的函數(shù)成員調(diào)用規(guī)則而被處理。
20.9.6委托創(chuàng)建表達(dá)式
如下內(nèi)容可替換§7.5.10.3中委托創(chuàng)建表達(dá)式的編譯時(shí)處理部分。
對(duì)于new d(e)形式的委托創(chuàng)建表達(dá)式的編譯時(shí)處理,其中d 是一個(gè)委托類型,e是一個(gè)表達(dá)式,由如下步驟組成。
如果e是一個(gè)方法組
- 對(duì)應(yīng)于e(a)形式的方法調(diào)用,一個(gè)單一的方法調(diào)用將被選擇。
u d的參數(shù)類型和修飾符(ref或out)被用作實(shí)參類型和實(shí)參列表a的修飾符。
u 在適用的測(cè)試和類型推斷中,轉(zhuǎn)換不予考慮。在隱式轉(zhuǎn)換足夠的實(shí)例中,類型要求是同一的。
u 重載決策步驟不會(huì)執(zhí)行。相反,候選的集合必須恰好包含一個(gè)與d兼容的方法(接著使用類型實(shí)參替換類型參數(shù)),并且這個(gè)方法將變成新創(chuàng)建委托所引用的方法。如果沒有匹配的方法存在,或有多個(gè)匹配的方法存在,將發(fā)生編譯時(shí)錯(cuò)誤。



- 如果被選擇的方法是一個(gè)實(shí)例方法,與e關(guān)聯(lián)的實(shí)例表達(dá)式確定委托的目標(biāo)對(duì)象。
- 結(jié)果是一個(gè)d類型的值,也就是引用選擇的方法和目標(biāo)對(duì)象的新創(chuàng)建委托。
否則,e是一個(gè)委托類型的值
- d和e必須兼容;否則出現(xiàn)編譯時(shí)錯(cuò)誤。
- 結(jié)果是d類型的值,也就是像e一樣引用相同的調(diào)用列表的新創(chuàng)建的委托。
否則,委托創(chuàng)建表達(dá)式是無(wú)效的,并且出現(xiàn)編譯時(shí)錯(cuò)誤。

20.10右移語(yǔ)法改變
泛型使用“<”和“>”字符分隔類型參數(shù)和類型實(shí)參(與c++的模板語(yǔ)法相似)。構(gòu)造類型有時(shí)可嵌套,如list<nullable<int>>,但使用這種構(gòu)件有一些微妙的語(yǔ)法問題:詞法將組合這個(gè)構(gòu)件的最后兩個(gè)標(biāo)記“>>”(右移運(yùn)算符),而不是產(chǎn)生句法需要的兩個(gè)“>”標(biāo)記。盡管一個(gè)可能的解決方案是在兩個(gè)“>>”中放入空格,這也是很尷尬而令人迷惑的,并沒有以任何方式增加程序的簡(jiǎn)潔性。
為了讓這些中性的構(gòu)件維持簡(jiǎn)單的詞法,“>>”和“>>=”標(biāo)記從詞法中刪除了,取代的是右移和右移賦值產(chǎn)生式。
運(yùn)算符或標(biāo)點(diǎn):之一
{ } [ ] ( ) . , : ;
+ - * / % & | ^ ! ~
= < > ? ++ -- && || == ->
!= <= >= += -= *= /= %= &= |=
^= << <<=
right-shift:(右移:)
> >
right-shift-assignment:(右移賦值)
> >=
不像在句法中的其他產(chǎn)生式,在右移和右移賦值產(chǎn)生式的標(biāo)記之間不允許任何種類的字符存在(甚至是空格)。


下面的產(chǎn)生式被使用右移或右移賦值進(jìn)行了修改。
shift-expression:(移位表達(dá)式:)
additive-expression(附加表達(dá)式)
shift-expression << additive-expression(移位表達(dá)式 << 附加表達(dá)式)
shift-expression right-shift additive-expression(移位表達(dá)式 right-shift 附加表達(dá)式)
assignment-operator:(賦值運(yùn)算符:)
=
+=
-=
*=
/=
%=
&=
|=
^=
<<=
right-shift-assignment
overloadable-binary-operator:(可重載二元運(yùn)算符:)
+
-
*
/
%
&
|
^
<<
right-shift
==
!=
>
<
>=
<=

(泛型完)
****************************
終于把這一章貼完了,哎,手都酸了,有問題的地方希望大家多多提出來(lái),千萬(wàn)別客氣:)
  • 本文來(lái)源于網(wǎng)頁(yè)設(shè)計(jì)愛好者web開發(fā)社區(qū)http://www.html.org.cn收集整理,歡迎訪問。
  • 發(fā)表評(píng)論 共有條評(píng)論
    用戶名: 密碼:
    驗(yàn)證碼: 匿名發(fā)表
    主站蜘蛛池模板: 尉氏县| 绥江县| 石嘴山市| 安泽县| 金平| 成都市| 旺苍县| 芜湖县| 芒康县| 新兴县| 泸定县| 娄底市| 望谟县| 洛阳市| 康平县| 保定市| 伊吾县| 漳州市| 辉县市| 新竹县| 大英县| 霍城县| 登封市| 寻甸| 江永县| 房山区| 凤城市| 长葛市| 九江县| 冷水江市| 咸丰县| 郁南县| 内黄县| 沧州市| 华亭县| 昭觉县| 滦南县| 周至县| 双鸭山市| 祁东县| 洛扎县|