What does this syntax do? if(obj is SomeType obj2)
我开始看到这些陈述,我试图用我的头脑来理解这些陈述。
1 2 3 4
| if (obj is SomeAuto car )
{
//Do stuff
} |
如果我理解正确的话,我们基本上是把obj转换成一辆"someauto"型的可变车。
1)本声明的官方术语是什么?
2)如果我想将if语句更改为基于特定原因有条件地执行,会发生什么情况?
例如,假设someauto是一个基类,而我只需要某种类型的auto,或者说我需要所有someauto,除了一种特定的类型。
- 参见stackoverflow.com/questions/184681/is-vs-typeof
- 看起来像C 7类型模式匹配:docs.microsoft.com/en-us/dotnet/csharp/language-reference/…
- 不圣洁的羊回答1),因为2)你可能需要另一种模式。
- 另外,2个问题应该是2个问题。您可以编辑并添加一个免责声明,说明您不知道术语是什么,并坚持只添加额外条件的问题。
- 感谢邪恶的羊
- "例如说someauto是一个基础类,我只想要某种类型的自动,或者说我想要所有的someauto,除了一种特定的类型。"访客模式浮现在我的脑海中。
- @私人小丑-请给出一个具体的案例,你正在为第二个问题,因为在其目前的状态,它使问题太广泛。(更好的办法是把那部分换成另一个问题
- 对。一定要换个问题。堆栈溢出策略是每个问题一个问题。如果您有多个问题,请在多个帖子上提问。
此if语句正在模式匹配下使用c_7.0中添加的is表达式。文件规定:
The is pattern expression extends the familiar is operator to query an object beyond its type.
它使您能够检查obj是否属于特定类型,并将强制转换结果赋给变量。
在这些功能之前,您可能会写:
1 2 3 4 5
| var car = obj as SomeAuto;
if(car != null)
{
//Do Stuff
} |
正如@burnba所指出的,使用as与原始is的区别在于,as运算符只执行引用转换、可空转换和装箱转换,因此不能用于检查不可空值类型。
- 嗯,小警告,as只适用于引用类型,而您可以将is用于int之类的东西。
- @伯恩斯巴-好评论。如果你能参考一下,我会相应地更新我的答案。
- 请注意,as运算符只执行引用转换、可空转换和装箱转换。as运算符不能执行其他转换,例如用户定义的转换,而应使用转换表达式来执行转换。"docs.microsoft.com/en-us/dotnet/csharp/language-reference/…
- @伯恩斯巴-谢谢-编辑了答案
- 如果我没记错,这只用于引用类型。对于值类型,执行普通的旧is+cast。
- 另外,在线文档是指语言规范,在我面前的5.0版本至少见7.10.10(is)和7.10.11(as)。
- @伯恩斯巴-is操作器来自于以前的C版本,如果我没有弄错的话是5,但是is expression只是来自于以后的版本。