Because when you do
List<string> b = (List<string>)ViewState["Blah"];
You're assigning to b
a pointer to a place in memory (a reference) and not a copy of the list. This means that b
and ViewState["Blah"]
points to the same list and changes on either of those affect the other.
You could clone your list if you want to detach b
from your ViewState
instance