在c# 1和2中, 初始化乙個陣列作為宣告乙個變數的一部分其表示式是相當簡潔的——但是如果你想在任何地方建立它, 你不得不宣告陣列的顯式型別.
隱式型別陣列
在c# 1和2中, 初始化乙個陣列作為宣告乙個變數的一部分其表示式是相當簡潔的——但是如果你想在任何地方建立它, 你不得不宣告陣列的顯式型別. 因此下面的例子完全可以聽過編譯而沒有任何問題:
1:string names = ;
下面的**則無法工作, 即便我們宣告了方法mymethod的簽名為mymethod(string names):
1: mymethod();
相反, 我們不得不告訴編譯器你想要初始化的陣列型別:
1: mymethod(newstring );
c# 3則允許類似下面這樣的呼叫:
1: mymethod(new );
很明顯, 編譯器需要去推斷出要使用的陣列型別. 從大括號裡面的元素開始, 如果能夠找到乙個所有其他元素都可以隱式轉換的型別, 那麼這就是陣列的型別, 否則**將無法編譯. 如果元素是型別無關的的表示式, 例如常量null或者匿名函式, **也無法編譯. 注意只有表示式的型別會被考慮為整體陣列型別的候選. 這意味著我們可能偶爾不得不將乙個值顯式轉換到另外乙個範圍更小的型別. 例如, 下面的**將無法編譯:
1:new
無法從memorystream轉換到stringwriter, 反之也一樣. 雖然兩者都能夠被轉換成object或者idisposable, 但編譯器僅僅考慮表示式本身所產生的型別. 在這個例子中, 如果我們將其中的乙個型別顯式轉換到object或者idisposable介面, 那麼**將可以編譯通過:
1:new
最後整個表示式的型別是idisposable. 比較一下之前我們提到的其他特性, 隱式型別陣列有一點點令人洩氣. 雖然他們確實讓生活變得更加簡單一點, 例如傳遞陣列作為引數的例子. 然而你可以爭論的一點是其並沒有在」用處和複雜度」的平衡上證明自己, 而這一點通常是語言設計者用來決定哪些特性應該成為語言的一部分.
C 隱式型別
隱式型別 1 源起 在隱式型別出現之前,我們在宣告乙個變數的時候,總是要為乙個變數指定他的型別 甚至在foreach乙個集合的時候,也要為遍歷的集合的元素,指定變數的型別 隱式型別的出現,程式設計師就不用再做這個工作了。2 使用方法 來看下面的 var a 1 int a 1 var b 123 s...
C 隱式型別
隱式型別 using system using system.collections.generic using system.linq using system.text using system.threading.tasks namespace 隱式型別var a.gettype consol...
C 隱式型別轉換
c 定義了一組內建型別物件之間的轉換標準,在必要時它們被編譯器隱式的應用到物件上。發生隱式型別轉換的情景 1,在混合型別的算術表示式中 轉換原則 轉換為最寬的資料型別。也可叫,算術轉換。int ival 5 double dval 3.14 ival 被提公升為double型別 ival dval ...