diff --git a/src/Chapter13.Tests/Table13.01.Tests.cs b/src/Chapter13.Tests/Table13.01.Tests.cs new file mode 100644 index 000000000..966f4571e --- /dev/null +++ b/src/Chapter13.Tests/Table13.01.Tests.cs @@ -0,0 +1,25 @@ +using AddisonWesley.Michaelis.EssentialCSharp.Shared.Tests; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter13.Table13_01.Tests; + +[TestClass] +public class LambdaHighlightTests +{ + + [TestMethod] + /* 1. */ [DataRow(".a")] + /* 2. */ [DataRow(".b")] + /* 3. */ [DataRow(".c")] + /* 4. */ [DataRow(".d", "CS0023")] + /* 5. */ [DataRow(".e", "CS0837")] + /* 6. */ [DataRow(".f", "CS0029", "CS1662")] + /* 7. */ [DataRow(".g", "CS8070", "CS1632")] + /* 8. */ [DataRow(".h", "CS0103")] + /* 9. */ [DataRow(".i", "CS0165")] + /* 10. */ [DataRow(".j", "CS0165")] + public async Task ParseAndCompile(string fileNameSuffix, params string[] errorIds) + { + await CompilerAssert.CompileAsync($"Table13.01{fileNameSuffix}.LambdaExpressionNotesAndExamples.cs", errorIds); + } +} \ No newline at end of file diff --git a/src/Chapter13/Table13.01.a.LambdaExpressionNotesAndExamples.cs b/src/Chapter13/Table13.01.a.LambdaExpressionNotesAndExamples.cs new file mode 100644 index 000000000..8c8839162 --- /dev/null +++ b/src/Chapter13/Table13.01.a.LambdaExpressionNotesAndExamples.cs @@ -0,0 +1,16 @@ +// Justification: Only snippets of source code shown for elucidation. +#pragma warning disable CS0168 // Variable is declared but never used + +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter13.Table13_01; + +public partial class LambdaExpressionNotesAndExamples +{ + // 1. + public static void DiscardParameters() + { +#if !NET6_0_OR_GREATER + Action x = (_, _)=> + Console.WriteLine("This is a test."); +#endif + } +} diff --git a/src/Chapter13/Table13.01.b.LambdaExpressionNotesAndExamples.cs b/src/Chapter13/Table13.01.b.LambdaExpressionNotesAndExamples.cs new file mode 100644 index 000000000..b9aaa69f6 --- /dev/null +++ b/src/Chapter13/Table13.01.b.LambdaExpressionNotesAndExamples.cs @@ -0,0 +1,18 @@ +// Justification: Only snippets of source code shown for elucidation. +#pragma warning disable CS0168 // Variable is declared but never used + +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter13.Table13_01; + +public partial class LambdaExpressionNotesAndExamples +{ + // 2. + static public void TypeInferenceOfExpression() + { +#if !NET6_0_OR_GREATER + //You can assign lambda + //expression to an implicitly + //typed local variable starting C#10 + var v = (int x) => x; +#endif + } +} diff --git a/src/Chapter13/Table13.01.c.LambdaExpressionNotesAndExamples.cs b/src/Chapter13/Table13.01.c.LambdaExpressionNotesAndExamples.cs new file mode 100644 index 000000000..e7d2c68b1 --- /dev/null +++ b/src/Chapter13/Table13.01.c.LambdaExpressionNotesAndExamples.cs @@ -0,0 +1,17 @@ +// Justification: Only snippets of source code shown for elucidation. +#pragma warning disable CS0168 // Variable is declared but never used + +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter13.Table13_01; + +public partial class LambdaExpressionNotesAndExamples +{ + // 3. + static public void ExpressionsCanHaveReturnTypes() + { +#if !NET6_0_OR_GREATER + Action action = void () => { }; + var func = short?(long number) => + number <= short.MaxValue ? (short)number : null; +#endif + } +} diff --git a/src/Chapter13/Table13.01.d.LambdaExpressionNotesAndExamples.cs b/src/Chapter13/Table13.01.d.LambdaExpressionNotesAndExamples.cs new file mode 100644 index 000000000..fdd4d8b97 --- /dev/null +++ b/src/Chapter13/Table13.01.d.LambdaExpressionNotesAndExamples.cs @@ -0,0 +1,19 @@ +// Justification: Only snippets of source code shown for elucidation. +#pragma warning disable CS0168 // Variable is declared but never used + +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter13.Table13_01; + +public partial class LambdaExpressionNotesAndExamples +{ + // 4. + public static void MemberMethodsOnExpressions() + { + //#if COMPILEERROR + #if !NET6_0_OR_GREATER + //ERROR: Operator "." cannot be applied to + //operand of type "lambda expression" + string s = ((int x) => x).ToString(); + #endif + //#endif // COMPILEERROR + } +} diff --git a/src/Chapter13/Table13.01.e.LambdaExpressionNotesAndExamples.cs b/src/Chapter13/Table13.01.e.LambdaExpressionNotesAndExamples.cs new file mode 100644 index 000000000..f6c11a055 --- /dev/null +++ b/src/Chapter13/Table13.01.e.LambdaExpressionNotesAndExamples.cs @@ -0,0 +1,20 @@ +// Justification: Only snippets of source code shown for elucidation. +#pragma warning disable CS0168 // Variable is declared but never used + +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter13.Table13_01; + +public partial class LambdaExpressionNotesAndExamples +{ + // 5. + public static void PatternMatchingOnType() + { +//#if COMPILEERROR +#if !NET6_0_OR_GREATER + //ERROR: The first operand of an "is" or "as" + //operator may not be a lambda expression or + //anonymous method + bool b = ((int x) => x) is Func; +#endif +//#endif // COMPILEERROR + } +} diff --git a/src/Chapter13/Table13.01.f.LambdaExpressionNotesAndExamples.cs b/src/Chapter13/Table13.01.f.LambdaExpressionNotesAndExamples.cs new file mode 100644 index 000000000..77e5948de --- /dev/null +++ b/src/Chapter13/Table13.01.f.LambdaExpressionNotesAndExamples.cs @@ -0,0 +1,19 @@ +// Justification: Only snippets of source code shown for elucidation. +#pragma warning disable CS0168 // Variable is declared but never used + +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter13.Table13_01; + +public partial class LambdaExpressionNotesAndExamples +{ + // 6. + public static void ConvertingToImproperDelegate() + { +//#if COMPILEERROR +#if !NET6_0_OR_GREATER + //ERROR: Lambda expression is not compatible + //with Func type + Func f = (int x) => x; +#endif +//#endif // COMPILEERROR + } +} diff --git a/src/Chapter13/Table13.01.g.LambdaExpressionNotesAndExamples.cs b/src/Chapter13/Table13.01.g.LambdaExpressionNotesAndExamples.cs new file mode 100644 index 000000000..6818489c1 --- /dev/null +++ b/src/Chapter13/Table13.01.g.LambdaExpressionNotesAndExamples.cs @@ -0,0 +1,30 @@ +// Justification: Only snippets of source code shown for elucidation. +#pragma warning disable CS0168 // Variable is declared but never used + +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter13.Table13_01; + +public partial class LambdaExpressionNotesAndExamples +{ + // 7. + public static void JumpStatementsToOutOfScopeDestinations() + { + //#if COMPILEERROR +#if !NET6_0_OR_GREATER + //ERROR: Control cannot leave the body of an + //anonymous method or lambda expression + string[] args = { "/File", "fileThatMostCertainlyDoesNotExist" }; + Func f; + switch (args[0]) + { + case "/File": + f = () => + { + if (!File.Exists(args[1])) + break; + return args[1]; + }; + } +#endif + //#endif // COMPILEERROR + } +} diff --git a/src/Chapter13/Table13.01.h.LambdaExpressionNotesAndExamples.cs b/src/Chapter13/Table13.01.h.LambdaExpressionNotesAndExamples.cs new file mode 100644 index 000000000..ff6999e86 --- /dev/null +++ b/src/Chapter13/Table13.01.h.LambdaExpressionNotesAndExamples.cs @@ -0,0 +1,21 @@ +// Justification: Only snippets of source code shown for elucidation. +#pragma warning disable CS0168 // Variable is declared but never used + +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter13.Table13_01; + +public partial class LambdaExpressionNotesAndExamples +{ + // 8. + public static void AccessingParametersAndLocalsOutOfBody() + { +//#if COMPILEERROR +#if !NET6_0_OR_GREATER + //ERROR: The name "first" does not + //exist in the current context + Func expression = + (first, second) => first > second; + first++; +#endif +//#endif // COMPILEERROR + } +} diff --git a/src/Chapter13/Table13.01.i.LambdaExpressionNotesAndExamples.cs b/src/Chapter13/Table13.01.i.LambdaExpressionNotesAndExamples.cs new file mode 100644 index 000000000..0e3466518 --- /dev/null +++ b/src/Chapter13/Table13.01.i.LambdaExpressionNotesAndExamples.cs @@ -0,0 +1,24 @@ +// Justification: Only snippets of source code shown for elucidation. +#pragma warning disable CS0168 // Variable is declared but never used + +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter13.Table13_01; + +public partial class LambdaExpressionNotesAndExamples +{ + // 9. + public static void UsingOutParameters() + { +//#if COMPILEERROR +#if !NET6_0_OR_GREATER + int number; + Func f = + text => int.TryParse(text, out number); + if (f("1")) + { + //ERROR: Use of unassigned local variable + System.Console.Write(number); + } +#endif +//#endif // COMPILEERROR + } +} diff --git a/src/Chapter13/Table13.01.j.LambdaExpressionNotesAndExamples.cs b/src/Chapter13/Table13.01.j.LambdaExpressionNotesAndExamples.cs new file mode 100644 index 000000000..245576ca2 --- /dev/null +++ b/src/Chapter13/Table13.01.j.LambdaExpressionNotesAndExamples.cs @@ -0,0 +1,25 @@ +// Justification: Only snippets of source code shown for elucidation. +#pragma warning disable CS0168 // Variable is declared but never used + +namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter13.Table13_01; + +public partial class LambdaExpressionNotesAndExamples +{ + // 10. + public static void CompilerWillNotDetectInLambdaAssignment() + { + //#if COMPILEERROR +#if !NET6_0_OR_GREATER + + int number; + Func isFortyTwo = + x => 42 == (number = x); + if (isFortyTwo(42)) + { + // ERROR: Use of unassigned local variable + System.Console.Write(number); + } +#endif + //#endif // COMPILEERROR + } +}