overwriting [] seems like readability nightmare.
Won't something like this work more clearly?
extension NullCall<T> on T? {
R? let<R>(R Function(T) f) => this == null ? null : f(this as T);
}
void example() {
int? n;
n.let(math.sqrt);
}
This kind of immitates Kotlin let.