Lots of good comments on my previous post. To briefly follow up:
Continue readingMonthly Archives: December 2007
Immutability in C# Part Six: A Simple Binary Tree
OK, we’ve gotten pretty good at this by now. A straightforward implementation of an immutable generic binary tree requires little comment on the basics. A binary tree is either empty, or a value, left tree and right tree:
Continue readingImmutability in C# Part Five: LOLZ!
My sadly soon-to-be-erstwhile coworker Cyrus made me a lolgeek shirt to go with this series of blog articles:


Cyrus, needless to say, is a big goof. Thanks, dude!
Commentary from 2022: When I wrote this post 14 years ago Cyrus was about to leave Microsoft and go work for… Google? maybe? I don’t recall. Anyway, after some time we were very fortunate to get him back at Microsoft and last I checked he was once again on the C# compiler team.
Immutability in C# Part Four: An Immutable Queue
An immutable queue is a bit trickier than an immutable stack, but we’re tough, we can handle it.
Continue readingImmutability in C# Part Three: A Covariant Immutable Stack
Now suppose we had a hypothetical future version of C# in which interface covariance worked, and we wanted a covariant immutable stack. That is, we want to be able to implicitly convert an IStack<Giraffe>
to IStack<Mammal>
.
As we’ve already discussed, this doesn’t make much sense in an array, even though doing so is legal in C# today. If you cast a Giraffe[]
to Mammal[]
then you can try to put a Tiger
into the Mammal[]
and it will fail at run time. It seems like the same should be true of stacks — if you cast an IStack<Giraffe>
to IStack<Mammal>
then you can push a Tiger
onto the stack of Giraffe
s, which should fail, right?
Maybe. Maybe not.
Continue readingImmutability in C# Part Two: A Simple Immutable Stack
Let’s start with something simple: an immutable stack.
Now, immediately I hear the objection: a stack is by its very nature something that changes. A stack is an abstract data type with the interface
void Push(T t);
T Pop();
bool IsEmpty { get; }
You push stuff onto it, you pop stuff off of it, it changes. How can it be immutable?
Continue reading