public State1(State2 state2) {
public static class State1Transitions {
public static TypeState<State2> Transition1(this TypeState<State1> typestate) {
return new TypeState<State2>(new State2(typestate.ConsumeState()));
public State2(State1 state1) {
public static class State2Transitions {
public static TypeState<State1> Transition2(this TypeState<State2> typestate) {
return new TypeState<State1>(new State1(typestate.ConsumeState()));
public class TypeState<T> where T : struct {
throw new InvalidOperationException("Typestate was invalidated");
public TypeState(T state) {
internal T ConsumeState() {
public static void Main()
var state = new TypeState<State1>(new State1());
var newstate1 = state.Transition1();
var newstate2 = newstate1.Transition2();
Console.WriteLine(newstate2.State.x);
try { Console.WriteLine(newstate1.State.y); } catch { Console.WriteLine("could not get newstate1"); }
try { Console.WriteLine(state.State.x); } catch { Console.WriteLine("could not get state"); }