Non-existing dates wouldn't be much help, I'm afraid. I expect the output to be similar to flipping pages in a wall calendar, i.e. I should end up on the correct month no matter what. Next, the day is adjusted to fit the available range.
Mirar's workaround unfortunately doesn't help:
Calendar.ISO.Day(2005, 03, 30) - Calendar.Month() * 1;
(4) Result: Day(Wed 2 Mar 2005)
Isn't the * 1 a no-op (or optimized away)? It doesn't become a range from what I can see:
Calendar.Month() * 1;
(7) Result: Month(June 2005)
Calendar.Month() * 2;
(8) Result: Month(Jun..Jul 2005)