最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

第 47 講:枚舉(三):其它枚舉相關(guān)的問(wèn)題

2021-07-10 20:19 作者:SunnieShine  | 我要投稿

前面已經(jīng)說(shuō)過(guò)了枚舉的基本使用方式,以及運(yùn)算符的使用。下面講一些有關(guān)枚舉類型的、前面沒(méi)有提到的問(wèn)題。

Part 1 枚舉字段是否定義的問(wèn)題

我們經(jīng)常使用枚舉類型把數(shù)值取出。但問(wèn)題是,前文我們?cè)诒磉_(dá)枚舉類型和整數(shù)類型進(jìn)行互相轉(zhuǎn)換的時(shí)候,尚未提及整個(gè)問(wèn)題,那就是:如果我們將一個(gè)不存在于枚舉類型里的特征值強(qiáng)制轉(zhuǎn)換為枚舉類型,那么使用它是成功的嗎?是拋異常呢,還是其它情況呢?

假設(shè)我有一個(gè)枚舉類型,只包含兩個(gè)數(shù)值:

顯然,我們也完全允許將一個(gè)超出范圍的特征值(比如 2)賦值給 Gender 類型的變量上。

因?yàn)?2 是整數(shù)類型數(shù)據(jù),所以需要強(qiáng)制轉(zhuǎn)換??蓡?wèn)題在于,這個(gè)枚舉類型就包含了 0 和 1 兩個(gè)特征值,對(duì)吧。那么賦值 2 會(huì)產(chǎn)生什么現(xiàn)象呢?

實(shí)際上,沒(méi)有任何事發(fā)生。賦值是成功的,也不會(huì)有異常,也不會(huì)中斷程序,更不會(huì)出現(xiàn)別的現(xiàn)象。這樣的賦值唯一和正常范圍的特征值表現(xiàn)出來(lái)效果不一樣的地方是調(diào)用 ToString 方法之后。

前者的 0 特征值對(duì)應(yīng)了 Gender 類型的 Male,因此這么轉(zhuǎn)換最后輸出的是 Male;而后者因?yàn)闆](méi)有對(duì)應(yīng)的字段,因此這么做輸出的結(jié)果是數(shù)字本身:2。

也就是說(shuō),如果對(duì)于一個(gè)沒(méi)有對(duì)應(yīng)字段的枚舉類型變量進(jìn)行 ToString 輸出的話,實(shí)際上輸出的是特征值本身;如果有的話,實(shí)際上輸出的就是這個(gè)字段的名字。這是兩種情況的不同點(diǎn),其它的使用完全都是一樣的,不會(huì)因?yàn)槌雒杜e定義范圍而直接告訴你不能這么用,C# 沒(méi)有必要限制得這么死,畢竟……沒(méi)定義又不是什么無(wú)傷大雅的事情。

Part 2 特征值表達(dá)式

前文我們學(xué)習(xí)了如何使用位運(yùn)算來(lái)對(duì)特殊的枚舉類型進(jìn)行操作。不過(guò),實(shí)際上 C# 甚至允許你直接在特征值賦值的時(shí)候書(shū)寫(xiě)表達(dá)式。比如這樣:

這樣的感覺(jué)。雖然上面舉的例子看起來(lái)有點(diǎn)廢話,這里只是為了展示給你看這個(gè)表達(dá)式是可以寫(xiě)進(jìn)去的。使用的字段和數(shù)字是可以直接通過(guò)加法計(jì)算得到的,這一點(diǎn)相當(dāng)方便。

不過(guò)這里稍微注意一點(diǎn)。我們之前說(shuō)過(guò),<<>> 是枚舉類型無(wú)法使用的運(yùn)算符,但是在特征值賦值的表達(dá)式里,我們可以用,但右側(cè)必須是一個(gè) int 類型的字面量。

比如這樣的枚舉,每一個(gè)字段都是前一個(gè)字段的特征值的兩倍。

但是我們?cè)谄綍r(shí)使用的時(shí)候,我們無(wú)法使用 << 運(yùn)算符,因?yàn)檫@是 C# 規(guī)定禁止使用的、為數(shù)不多的運(yùn)算符之一:

Part 3 負(fù)數(shù)特征值的枚舉轉(zhuǎn)換

可能你使用過(guò)帶符號(hào)類型的整數(shù)作為特征值的基本類型表示在枚舉類型的“繼承關(guān)系”上。實(shí)際上,默認(rèn)情況下枚舉類型是使用 int 這個(gè)帶符號(hào)的類型作為特征值類型的。

那么,如果我賦值 -1 作為某字段的特征值的話,我要想使用它,你可能會(huì)這么寫(xiě)代碼:

是吧。因?yàn)槲铱偸窍雽?-1 當(dāng)成特征值轉(zhuǎn)換給 TestEnum 上去。然而實(shí)際上,這么轉(zhuǎn)換有問(wèn)題,會(huì)產(chǎn)生一個(gè)編譯器錯(cuò)誤,并提示你改成這樣:

是的,只是給 -1 加了個(gè)括號(hào)就可以了。這是 C# 團(tuán)隊(duì)最初設(shè)計(jì)類型系統(tǒng)的時(shí)候這么作了個(gè)規(guī)定。因?yàn)樨?fù)數(shù)直接的字面量并不是真正意義上的字面量的一部分,實(shí)際上它還是一個(gè)表達(dá)式。只是這個(gè)負(fù)號(hào)被我們?nèi)藶槔斫鉃槭且粋€(gè)綁定在 1 上的、標(biāo)記數(shù)字是負(fù)數(shù)的記號(hào)。在編程世界里,運(yùn)算符在哪里都是運(yùn)算符,所以 -1 是一個(gè)表達(dá)式,是一個(gè)常量表達(dá)式,并非一個(gè)字面量。

另外在 C# 的字面量系統(tǒng)里,數(shù)據(jù)使用字面量有很復(fù)雜的轉(zhuǎn)換關(guān)系(什么“不超過(guò)一定范圍的字面量,雖然是 int 類型也可以表示為較小數(shù)據(jù)類型”之類的規(guī)則)。正是因?yàn)檫@些規(guī)則的約束,一旦放開(kāi) -1 不添加括號(hào)直接轉(zhuǎn)換的話,就會(huì)和這些細(xì)節(jié)產(chǎn)生一定的語(yǔ)義沖突。為了避免這一點(diǎn),C# 不得不讓你添加這個(gè)小括號(hào),告訴你要想是負(fù)數(shù)枚舉特征值的話,就必須加了小括號(hào)后再來(lái)強(qiáng)制轉(zhuǎn)換。


第 47 講:枚舉(三):其它枚舉相關(guān)的問(wèn)題的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
华安县| 崇义县| 涟水县| 余江县| 鸡西市| 大同市| 思南县| 鄂托克前旗| 塘沽区| 永嘉县| 太谷县| 南部县| 思南县| 城口县| 宣化县| 民和| 静宁县| 鲁山县| 罗江县| 光山县| 巧家县| 连平县| 齐河县| 罗定市| 青神县| 桐庐县| 绍兴市| 定州市| 镶黄旗| 库车县| 达日县| 获嘉县| 昌黎县| 永顺县| 闻喜县| 婺源县| 泽州县| 澳门| 旌德县| 无锡市| 丰都县|