Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用var或显式类型时模式匹配中的不同行为_C# - Fatal编程技术网

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
vs
is
> Is in list