В первом случае вы используете безопасное приведение (как?) К необнуляемому типу XYZ. Если it
является экземпляром XYZ, то он просто приведёт it
к XYZ. Если it
не является экземпляром XYZ (или если it
равно нулю), то он вернет значение NULL.
Во втором случае вы используете небезопасное приведение (as) к типу XYZ, допускающему значение NULL ?. Если it
является экземпляром XYZ или it
равно нулю, тогда он будет преобразовывать it
в XYZ? (или вернуть ноль, если it
ноль). Если it
не является экземпляром XYZ, оно выдаст исключение.