【问题标题】:What does this syntax do? if(obj is SomeType obj2)这个语法有什么作用? if(obj 是 SomeType obj2)
【发布时间】:2018-03-25 17:20:54
【问题描述】:

我开始看到这些陈述,我正试图围绕这些陈述进行思考。

if (obj is SomeAuto car)
{
   //Do stuff
}

如果我理解正确,我们基本上是将 obj 转换为变量 car ,这将是“SomeAuto”类型?

1) 本声明的官方术语是什么?

2) 如果我想将 if 语句更改为因特定原因有条件地执行会发生什么?

例如说 SomeAuto 是一个基类,我只想要某种类型的汽车,或者说我想要所有的 SomeAuto,除了一种特定的类型。

【问题讨论】:

  • 看起来像 C#7 类型的模式匹配:docs.microsoft.com/en-us/dotnet/csharp/language-reference/…
  • UnholySheep 回答 1) ,对于 2) 你可能需要另一种模式。
  • 另外,2个问题应该是2个问题。您可以编辑并添加一个您不知道术语是什么的免责声明,并只回答有关添加额外条件的问题
  • @PrivateJoker - 请给出您针对第二个问题所指的具体案例,因为在当前状态下,它使问题过于宽泛。 (更好的是将该部分删除到另一个问题中

标签: c#


【解决方案1】:

此 if 语句使用在 C# 7.0 under pattern matching 中添加的 is 表达式。文档指定:

is 模式表达式扩展了熟悉的 is 运算符来查询超出其类型的对象。

它使您能够检查obj 是否属于特定类型,并将转换结果分配给变量。


在这些功能之前你可能会写:

var car = obj as SomeAuto;
if(car != null)
{
    //Do Stuff
}

正如@BurnBA 所指出的,使用as 与原始is 的区别在于请注意,as 运算符只执行引用转换、可空转换和装箱转换,因此不能用于检查不可为空的值类型。

【讨论】:

  • @BurnsBA - 好评论。如果您可以提供参考,我会相应地更新我的答案
  • "请注意,as 运算符只执行引用转换、可为空的转换和装箱转换。as 运算符不能执行其他转换,例如用户定义的转换,应改为使用投射表达式。” docs.microsoft.com/en-us/dotnet/csharp/language-reference/…
  • 如果我没记错的话,这仅用于引用类型。对于值类型,执行普通的旧 is+cast。
  • 另外,在线文档指的是语言规范,至少对于我面前的 5.0 版本,请参见 7.10.10 (is) 和 7.10.11 (as)。
猜你喜欢
  • 2018-03-02
  • 1970-01-01
  • 1970-01-01
  • 2020-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多