At runtime, a failing downcast evaluates to null.
At compile time, it gives an error:
"Error: cannot reinterpret class from C to test.B at compile time"
It should just evaluate to null, too.
---
class A {}
class B : A {}
class C : A {}
bool test(T)() {
A a = new T;
return (cast(B) a) !is null;
}
void main() {
assert(test!B()); // ok
assert(!test!C()); // ok
static assert(test!B()); // ok
static assert(!test!C()); // error
}
---