Zal*_*mon 6 .net c# null-coalescing-operator
我有三个继承自'IFoo'接口的类(classA,classB和classC); 如果使用这个
var fooItem = (request.classAitem ?? (request.classBitem as IFoo ?? request.classCitem))
Run Code Online (Sandbox Code Playgroud)
要么
var fooItem = (request.classAitem ?? request.classBitem ?? request.classCitem as IFoo)
Run Code Online (Sandbox Code Playgroud)
它工作得很好,但其他组合甚至不会编译:
var fooItem = (request.classAitem as IFoo ?? request.classBitem ?? request.classCitem)
Run Code Online (Sandbox Code Playgroud)
要么
var fooItem = (request.classAitem ?? request.classBitem ?? request.classCitem) as IFoo
Run Code Online (Sandbox Code Playgroud)
在我看来,在某些情况下,编译器隐式地将子类解包到它们的IFoo接口,但在其他一些情况下却没有.你们有什么感想?
在两个不起作用的示例中,因为??是右关联的,我们首先尝试确定此表达式的数据类型:
request.classBitem ?? request.classCitem
Run Code Online (Sandbox Code Playgroud)
如果数据类型不同,则数据类型只能是其输入之一的数据类型.显然在这两个方向都没有可用的转换,因此您得到编译器错误.请注意,编译器不会决定这里的数据类型IFoo只是因为两个类都碰巧实现它(如果它确实如此,如果它们都实现了多个公共接口会发生什么?)
将此与前两个示例进行比较.首先,我们首先考虑这个表达式:
request.classBitem as IFoo ?? request.classCitem
Run Code Online (Sandbox Code Playgroud)
此表达式的类型是或者IFoo数据类型request.classCitem是什么.有一个转换类型为request.classCitemto IFoo,因此显然已选中,因此整个表达式的数据类型是IFoo.然后用它来确定整个表达式的类型(同样IFoo).
第二种情况非常相似,因为??是右关联1,我们首先要确定类型:
request.classBitem ?? request.classCitem as IFoo
Run Code Online (Sandbox Code Playgroud)
而且,我们可以IFoo在数据类型和数据类型之间进行选择request.classBitem.有一个转换IFoo,所以这是选择.
1并且还要注意,这意味着第一个示例中的括号是多余的.
| 归档时间: |
|
| 查看次数: |
100 次 |
| 最近记录: |