public void NewTest() { void A() { B(); } void B() { C(); } void C() { Nothing.Unreachable(); } Result <TestResultInnerClass> CalcFoo(bool success) { if (success) { return(Result.Success(new TestResultInnerClass { Number = 1 })); } return(Result.Fail("Fail")); } var result1 = CalcFoo(true); Assert.AreEqual(true, result1.Succeed); Assert.AreEqual(1, result1.Value.Number); Assert.AreEqual(1, result1.Unwrap().Number); TestResultInnerClass.Check(result1.Unwrap()); var result2 = CalcFoo(false); Assert.AreEqual(false, result2.Succeed); Assert.AreEqual("Fail", result2.FailMessage); Assert.Throws <ResultException>(() => result2.Unwrap()); Assert.Throws <InvalidOperationException>(() => Result.Wrap(A).Unwrap()); }