2017-08-27 21 views
9

時,請考慮以下,乍一看荒謬,模式匹配:不同的行爲模式匹配使用VAR或顯式類型

string s = null; 
if (s is string ss) //false 
if (s is string) //false 

兩個is將返回false。但是,如果我們使用var的行爲完全改變:

string s = null; 
if (s is var ss) //true!?! 

如果您在VS2017懸停在var,型號爲stringis的行爲是完全不同的。即使推斷類型相同,編譯器也在做一些完全不同的事情。怎麼會這樣?這是一個錯誤? null類型以某種方式冒出來?

+0

是不是'var ss'定義新的空變量? 這裏:https://visualstudiomagazine.com/articles/2017/02/01/pattern-matching.aspx 你可以看到它是創建需要類型的臨時變量,然後你可以檢查條件是否爲真。 – sTrenat

+0

@sTrenat好的,爲什麼'字符串ss'不是? – InBetween

+0

我認爲運算符'是'在做.GetType()然後檢查類型是否好,對於null,沒有指定類型,所以它不能檢查它。 對於新的'var'操作符,它分配他所得到的任何東西 – sTrenat

回答

5

C#語言參考確認行爲是有意的。

與var模式匹配的模式總是成功。它的語法是

expr is var varname 

如果expr的值總是被分配到一個名爲 varname的一個局部變量。 varname是與表達式相同類型的靜態變量。

請注意,如果expr爲空,表達式仍爲爲真,並將null指定給varname。

Source: MSDN - C# Language Reference


var圖案

的變種圖案只是複製源變量到一個新的命名的變量,然後可以建立與一個case塊表達式如下面

string s = null; 
var collection = new string[] { "abb", "abd", "abc", null}; 

switch (s) 
{ 
    case "xyz": 
     Console.WriteLine("Is xyz"); 
     break; 

    case var ss when (collection).Contains(s): 
     Console.WriteLine("Is in list"); 
     break; 

    default: 
     Console.WriteLine("Failed!"); 
     break; 

} 

輸出:

> Is in list 
+0

它從VB複製。例如,您現在可以使用: 開關(年齡) { 案例50: ageBlock =「大五哦」; 休息; case var testAge when(new List () {80,81,82,83,84,85,86,87,88,89})。包含(testAge): ageBlock =「octogenarian」; 休息; ((testAge> = 90)&(testAge <= 99)): ageBlock =「nonagenarian」; case var testAge when 休息; case var testAge when(testAge> = 100): ageBlock =「centenarian」; 休息; 默認: ageBlock =「只是老」; 休息; } 或者,如果statemant if(s是var ss,當ss!= null) – sTrenat

+0

但我現在不在if如果有任何有用的情況if() – sTrenat

+0

這是正確的,在if語句中使用它。 –