在我们的代码中,我们输入检查内容,然后立即需要转换它们。像这样的东西:
if((foo is SomeClass) && (foo as SomeClass).Bar != null) {
SomeClass fooClass = foo as SomeClass;
DoSomething(fooClass.Bar);
...
}
Run Code Online (Sandbox Code Playgroud)
我希望有某种方式,在显式类型检查之后,foo可以隐式地将引用转换为类:
if (foo is SomeClass && foo.Bar != null) {
DoSomething(foo.Bar);
}
Run Code Online (Sandbox Code Playgroud)
它通过了(foo is SomeClass)所以我们知道这foo是一个SomeClass. 该as投似乎是多余的。如果您在已通过的语句中,(foo is SomeClass)那么您似乎不必再显式转换foo为SomeClass
在任何人谈论编码实践之前......我知道。理想情况下,在我们应用程序的大多数地方,我们充分利用泛型、抽象类、接口和所有其他方法以合理的方式与对象交互。但有时你会得到一个object并需要检查它,尤其是像事件这样的事情。我没有用做一个真正的问题is/as全完了,我只是好奇,如果有一些神奇的语法我可以使用,这是一个有点清洁。这是语法优化的实验,不是实用性。
作为测试,我使用了一个名为 I call 的扩展方法IsAs:
public static bool IsAs<T>(this object check, out T result) {
if (check is T) {
result = (T)check;
return true;
}
result = default(T);
return false;
}
Run Code Online (Sandbox Code Playgroud)
这将返回一个布尔值,完成该is部分,并使用参考输入来填充as. 但在实践中,语法并不清晰:
SomeClass fooClass;
if(foo.IsAs<SomeClass>(out fooClass) && fooClass.Bar != null) {
DoSomething(fooClass)
...
}
Run Code Online (Sandbox Code Playgroud)
Noa*_*ahl 10
使用is 类型模式表达式,您可以将结果转换分配给变量:
if (foo is SomeClass fooSomeClass && fooSomeClass.Bar != null)
{
DoSomething(fooSomeClass.Bar);
}
Run Code Online (Sandbox Code Playgroud)