C# 使用var或显式类型时模式匹配中的不同行为
乍一看,考虑以下模式匹配:C# 使用var或显式类型时模式匹配中的不同行为,c#,C#,乍一看,考虑以下模式匹配: 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上,则类型为string,但的行为是完全不同的。编译器正在做一些根本不同的事情,即使推断的类型是相同的。这怎么可能?这是虫子吗?n
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
上,则类型为string
,但的行为是
完全不同的。编译器正在做一些根本不同的事情,即使推断的类型是相同的。这怎么可能?这是虫子吗?null
类型是否以某种方式冒泡出来?C语言引用确认了行为的意图
与var模式的模式匹配总是成功的。它的语法是
其中expr的值始终指定给名为
瓦纳姆。varname是一个与expr类型相同的静态变量
请注意,如果expr为null,则is表达式仍然为true,并将null赋值给varname。
var
模式
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
“var ss”不是在定义新的空变量吗?这里:您可以看到它是所需类型的create temp变量,然后您可以检查条件是否为真。@STREAT Ok,以及为什么
string ss
不是?我认为运算符“是”正在执行。GetType()然后检查类型是否为好,对于null,没有指定类型,因此无法检查它。对于新的'var'操作符,它分配他用新操作符得到的任何东西,你可以写if(s是var ss when(ss!=null)),但这是为开关操作符完成的:请引用:“var模式,使用var关键字,简单地将源测试变量或表达式复制到一个新的命名变量中:…”它是从VB复制的。例如,您现在可以使用:switch(age){case 50:ageBlock=“the big five oh”;break;case-var-testAge when(new List(){80,81,82,83,84,85,86,87,88,89})。Contains(testAge):ageBlock=“octogenarian”;break;case-var-testAge when((testAge>=90)和(testAge=100):ageBlock=“centernian”;break;default:ageBlock=“just old”break;}或者,对于if statemant if(s是var ss,当ss!=null时),但我现在不知道if()中是否有任何有用的大小写是的,在if
语句中它实际上没有任何用处。@Streat很准确,我理解开关的用法,但在这种情况下,它不是一个带有is
的布尔表达式。它不是if
子句,而是is
我觉得毫无意义,并且有意外的行为。@in在MSDN中有一个仅用于演示行为的示例,我认为var模式根本不打算用于if
语句,但在case
语句中更是如此。它看起来更像是要指出存在(正如您所怀疑的)is
vsis
> Is in list