位置:首頁(yè) > 軟件操作教程 > 編程開(kāi)發(fā) > C# > 問(wèn)題詳情

C# 類型推理

提問(wèn)人:劉團(tuán)圓發(fā)布時(shí)間:2020-12-08

    c#是一種強(qiáng)類型化的語(yǔ)言,這表示每個(gè)變量都有固定的類型,只能用于接受該類型的代碼中。在前面的所有代碼示例中,都采用如下兩種形式的代碼來(lái)聲明變量:

    <type> <varName>;

    <type> <varName> = <value>?

下面的代碼顯不了變量<varNcrme>的類型:

    int mylnt = 5;

    WriteLine(mylnt);

將鼠標(biāo)指針停放在變量標(biāo)識(shí)符上,IDE就會(huì)顯示該變量的類型,如圖下所示。

    int mylnt = 5;

    WriteLine(nylnt);

            ? (local variable) int mylnt

C# 3引入了新關(guān)鍵字van它可以替代前面代碼中的type:

    var <varWa/ne> = <value>;

在這行代碼中,變量隱式地類型化為<varName>的類型。注意,類型的名稱并不是var。在下面的代碼中:

    var myVar = 5;

myVar是int類型的變量,而不是var類型的變量,如下所示,IDE也顯示了其類型。

    var *ylnt =5;

    WriteLine(mylnt);

            ?(local variable) int mylnt

    這是非常重要的一點(diǎn)。使用var時(shí),并不是聲明了一個(gè)沒(méi)有類型的變量,也不是聲明了一個(gè)類型可變的變量。否則,C#就不再是強(qiáng)類型化的語(yǔ)言了。實(shí)際上,我們所做的只是依賴于編譯器來(lái)確定變量的類型。

    如果編譯器不能確定用var聲明的變量類型,代碼就無(wú)法編譯。因此,在用var聲明變量時(shí),必須同時(shí)初始化該變量,因?yàn)槿绻麤](méi)有初始值,編譯器就無(wú)法確定變量的類型。因此,下面的代碼就無(wú)法編譯:

    var myVar;

var關(guān)鍵字還可以通過(guò)數(shù)組初始化器來(lái)推斷數(shù)組的類型:

    var myArray = new[] { 4, 5, 2 );


在這行代碼中,myArray類型被隱式地設(shè)置為int[]。在采用這種方式隱式指定數(shù)組的類型時(shí),初始化器中使用的數(shù)組元素必須是以下情形中的一種:

    ?相同的類型

    ?相同的引用類型或null

    ?所有元素的類型都可以隱式地轉(zhuǎn)換為一個(gè)類型

    如果應(yīng)用最后一條規(guī)則,元素可以轉(zhuǎn)換的類型就稱為數(shù)組元素的最佳類型。如果這個(gè)最佳類型有任何含糊之處,即所有元素的類型都可以隱式轉(zhuǎn)換為兩種或更多的類型,代碼就不會(huì)編譯。我們會(huì)接收到錯(cuò)誤,錯(cuò)誤中指出沒(méi)有最佳類型,如下所示:

    var myArray = new[] { 4, "not an int", 2 };

還要注意數(shù)字值從來(lái)都不會(huì)解釋為可空類型,所以下面的代碼無(wú)法編譯:

    var myArray = new[] { 4, null, 2 };

但可以使用標(biāo)準(zhǔn)的數(shù)組初始化器,使如下代碼可編譯:

    var myArray = new int?[] { 4, null, 2 };

    最后一點(diǎn)要說(shuō)明的是,標(biāo)識(shí)符var并非不能用于類名。這意味著,如果代碼在其作用域中(在同一個(gè)名稱空間或引用的名稱空間中)有一個(gè)var類,就不能使用var關(guān)鍵字的隱式類型化功能。

    類型推理功能本身并不是很有效,因?yàn)樵诒竟?jié)前面的代碼中,它只會(huì)使事情更復(fù)雜。使用var會(huì)加大判斷給定變量的類型的難度。推斷類型的概念非常重要,因?yàn)樗瞧渌夹g(shù)的基礎(chǔ)。

繼續(xù)查找其他問(wèn)題的答案?

相關(guān)視頻回答
回復(fù)(0)
返回頂部