更好的处理方式是/作为检查和铸造

zak*_*ach 2 c#

在我们的代码中,我们输入检查内容,然后立即需要转换它们。像这样的东西:

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)那么您似乎不必再显式转换fooSomeClass

在任何人谈论编码实践之前......我知道。理想情况下,在我们应用程序的大多数地方,我们充分利用泛型、抽象类、接口和所有其他方法以合理的方式与对象交互。但有时你会得到一个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)