This is not exactly a false positive, however I agree that an issue should not be raised.
The last switch arm is implicitly a discard pattern, as you are covering all the other possible cases above. If instance is not of type DerivedClass and it’s not null then it’s for sure null, thus the last arm will always be true when the execution reaches that spot.
To remove this issue you could replace the third arm with _ => "C" since we do detect discards in switch and exclude them.
Meanwhile I opened an issue in our backlog(internal only) to detect this case and not raise S2589.