Fix verification for C# unions (#7970)

* Fix verification for unions

* Run scripts\generate_code.py

---------

Co-authored-by: Michael Le <michael.le647@gmail.com>
diff --git a/src/idl_gen_csharp.cpp b/src/idl_gen_csharp.cpp
index 369460d..4e1c874 100644
--- a/src/idl_gen_csharp.cpp
+++ b/src/idl_gen_csharp.cpp
@@ -431,6 +431,10 @@
     if (opts.generate_object_based_api) {
       GenEnum_ObjectAPI(enum_def, code_ptr, opts);
     }
+
+    if (enum_def.is_union) {
+      code += GenUnionVerify(enum_def.underlying_type);
+    }
   }
 
   bool HasUnionStringValue(const EnumDef &enum_def) const {
@@ -1755,8 +1759,6 @@
     code += "  }\n";
     code += "}\n\n";
 
-    code += GenUnionVerify(enum_def.underlying_type);
-
     // JsonConverter
     if (opts.cs_gen_json_serializer) {
       if (enum_def.attributes.Lookup("private")) {
diff --git a/tests/FlatBuffers.Test/Assert.cs b/tests/FlatBuffers.Test/Assert.cs
index 7bb8004..b0ecb59 100644
--- a/tests/FlatBuffers.Test/Assert.cs
+++ b/tests/FlatBuffers.Test/Assert.cs
@@ -99,6 +99,26 @@
             }
         }
 
+        public static void ArrayEqual<T>(ArraySegment<T> expected, T[] actual)
+        {
+#if NETCOREAPP
+            ArrayEqual(expected.ToArray(), actual);
+#else
+            if (expected.Count != actual.Length)
+            {
+                throw new AssertFailedException(expected, actual);
+            }
+
+            for (var i = 0; i < expected.Count; ++i)
+            {
+                if (!expected.Array[expected.Offset + i].Equals(actual[i]))
+                {
+                    throw new AssertArrayFailedException(i, expected, actual);
+                }
+            }
+#endif
+    }
+
         public static void IsTrue(bool value)
         {
             if (!value)
diff --git a/tests/FlatBuffers.Test/ByteBufferTests.cs b/tests/FlatBuffers.Test/ByteBufferTests.cs
index 6bff2ac..f01c7ca 100644
--- a/tests/FlatBuffers.Test/ByteBufferTests.cs
+++ b/tests/FlatBuffers.Test/ByteBufferTests.cs
@@ -422,7 +422,7 @@
       
             // Get the full array back out and ensure they are equivalent
             var bbArray = uut.ToArray<T>(nOffset, data.Count);
-            Assert.ArrayEqual(data.ToArray(), bbArray);
+            Assert.ArrayEqual(data, bbArray);
         }
     
         public unsafe void ByteBuffer_Put_IntPtr_Helper<T>(T[] data, int typeSize)
@@ -643,7 +643,7 @@
             float[] data = null;
             Assert.Throws<ArgumentNullException>(() => uut.Put(1024, data));
 
-            ArraySegment<float> dataArraySegment = default;
+            ArraySegment<float> dataArraySegment = default(ArraySegment<float>);
             Assert.Throws<ArgumentNullException>(() => uut.Put(1024, dataArraySegment));
 
             IntPtr dataPtr = IntPtr.Zero;
diff --git a/tests/FlatBuffers.Test/FlatBufferBuilderTests.cs b/tests/FlatBuffers.Test/FlatBufferBuilderTests.cs
index 7fe9740..71fd1d0 100644
--- a/tests/FlatBuffers.Test/FlatBufferBuilderTests.cs
+++ b/tests/FlatBuffers.Test/FlatBufferBuilderTests.cs
@@ -15,6 +15,7 @@
  */
 
 using System;
+using System.Diagnostics;
 
 namespace Google.FlatBuffers.Test
 {
@@ -586,12 +587,14 @@
         [FlatBuffersTestMethod]
         public void FlatBufferBuilder_Add_ArraySegment_Default_Throws()
         {
-            var fbb = CreateBuffer(false);
+#if NETCOREAPP
+      var fbb = CreateBuffer(false);
 
             // Construct the data array
-            ArraySegment<float> data = default;
+            ArraySegment<float> data = default(ArraySegment<float>);
 
             Assert.Throws<ArgumentNullException>(() => fbb.Add(data));
+#endif
         }
             
         [FlatBuffersTestMethod]
diff --git a/tests/FlatBuffers.Test/FlatBuffers.Test.csproj b/tests/FlatBuffers.Test/FlatBuffers.Test.csproj
index 0f683cb..de129e1 100644
--- a/tests/FlatBuffers.Test/FlatBuffers.Test.csproj
+++ b/tests/FlatBuffers.Test/FlatBuffers.Test.csproj
@@ -66,6 +66,9 @@
     <Compile Include="..\..\net\FlatBuffers\FlatBufferConstants.cs">
       <Link>FlatBuffers\FlatBufferConstants.cs</Link>
     </Compile>
+    <Compile Include="..\..\net\FlatBuffers\FlatBufferVerify.cs">
+      <Link>FlatBuffers\FlatBufferVerify.cs</Link>
+    </Compile>
     <Compile Include="..\..\net\FlatBuffers\Struct.cs">
       <Link>FlatBuffers\Struct.cs</Link>
     </Compile>
@@ -120,6 +123,9 @@
     <Compile Include="..\MyGame\Example\ArrayStruct.cs">
       <Link>MyGame\Example\ArrayStruct.cs</Link>
     </Compile>
+    <Compile Include="..\MyGame\Example\LongEnum.cs">
+      <Link>MyGame\Example\LongEnum.cs</Link>
+    </Compile>
     <Compile Include="..\MyGame\Example\NestedStruct.cs">
       <Link>MyGame\Example\NestedStruct.cs</Link>
     </Compile>
@@ -220,4 +226,4 @@
   <Target Name="AfterBuild">
   </Target>
   -->
-</Project>
\ No newline at end of file
+</Project>
diff --git a/tests/KeywordTest/KeywordsInUnion.cs b/tests/KeywordTest/KeywordsInUnion.cs
index d8a870f..3fccb13 100644
--- a/tests/KeywordTest/KeywordsInUnion.cs
+++ b/tests/KeywordTest/KeywordsInUnion.cs
@@ -37,28 +37,6 @@
   }
 }
 
-
-
-static public class KeywordsInUnionVerify
-{
-  static public bool Verify(Google.FlatBuffers.Verifier verifier, byte typeId, uint tablePos)
-  {
-    bool result = true;
-    switch((KeywordsInUnion)typeId)
-    {
-      case KeywordsInUnion.@static:
-        result = KeywordTest.KeywordsInTableVerify.Verify(verifier, tablePos);
-        break;
-      case KeywordsInUnion.@internal:
-        result = KeywordTest.KeywordsInTableVerify.Verify(verifier, tablePos);
-        break;
-      default: result = true;
-        break;
-    }
-    return result;
-  }
-}
-
 public class KeywordsInUnionUnion_JsonConverter : Newtonsoft.Json.JsonConverter {
   public override bool CanConvert(System.Type objectType) {
     return objectType == typeof(KeywordsInUnionUnion) || objectType == typeof(System.Collections.Generic.List<KeywordsInUnionUnion>);
@@ -102,4 +80,26 @@
 }
 
 
+
+static public class KeywordsInUnionVerify
+{
+  static public bool Verify(Google.FlatBuffers.Verifier verifier, byte typeId, uint tablePos)
+  {
+    bool result = true;
+    switch((KeywordsInUnion)typeId)
+    {
+      case KeywordsInUnion.@static:
+        result = KeywordTest.KeywordsInTableVerify.Verify(verifier, tablePos);
+        break;
+      case KeywordsInUnion.@internal:
+        result = KeywordTest.KeywordsInTableVerify.Verify(verifier, tablePos);
+        break;
+      default: result = true;
+        break;
+    }
+    return result;
+  }
+}
+
+
 }
diff --git a/tests/MyGame/Example/Any.cs b/tests/MyGame/Example/Any.cs
index 021faa6..ce583f0 100644
--- a/tests/MyGame/Example/Any.cs
+++ b/tests/MyGame/Example/Any.cs
@@ -41,31 +41,6 @@
   }
 }
 
-
-
-static public class AnyVerify
-{
-  static public bool Verify(Google.FlatBuffers.Verifier verifier, byte typeId, uint tablePos)
-  {
-    bool result = true;
-    switch((Any)typeId)
-    {
-      case Any.Monster:
-        result = MyGame.Example.MonsterVerify.Verify(verifier, tablePos);
-        break;
-      case Any.TestSimpleTableWithEnum:
-        result = MyGame.Example.TestSimpleTableWithEnumVerify.Verify(verifier, tablePos);
-        break;
-      case Any.MyGame_Example2_Monster:
-        result = MyGame.Example2.MonsterVerify.Verify(verifier, tablePos);
-        break;
-      default: result = true;
-        break;
-    }
-    return result;
-  }
-}
-
 public class AnyUnion_JsonConverter : Newtonsoft.Json.JsonConverter {
   public override bool CanConvert(System.Type objectType) {
     return objectType == typeof(AnyUnion) || objectType == typeof(System.Collections.Generic.List<AnyUnion>);
@@ -110,4 +85,29 @@
 }
 
 
+
+static public class AnyVerify
+{
+  static public bool Verify(Google.FlatBuffers.Verifier verifier, byte typeId, uint tablePos)
+  {
+    bool result = true;
+    switch((Any)typeId)
+    {
+      case Any.Monster:
+        result = MyGame.Example.MonsterVerify.Verify(verifier, tablePos);
+        break;
+      case Any.TestSimpleTableWithEnum:
+        result = MyGame.Example.TestSimpleTableWithEnumVerify.Verify(verifier, tablePos);
+        break;
+      case Any.MyGame_Example2_Monster:
+        result = MyGame.Example2.MonsterVerify.Verify(verifier, tablePos);
+        break;
+      default: result = true;
+        break;
+    }
+    return result;
+  }
+}
+
+
 }
diff --git a/tests/MyGame/Example/AnyAmbiguousAliases.cs b/tests/MyGame/Example/AnyAmbiguousAliases.cs
index 3fb3d77..e85b055 100644
--- a/tests/MyGame/Example/AnyAmbiguousAliases.cs
+++ b/tests/MyGame/Example/AnyAmbiguousAliases.cs
@@ -41,31 +41,6 @@
   }
 }
 
-
-
-static public class AnyAmbiguousAliasesVerify
-{
-  static public bool Verify(Google.FlatBuffers.Verifier verifier, byte typeId, uint tablePos)
-  {
-    bool result = true;
-    switch((AnyAmbiguousAliases)typeId)
-    {
-      case AnyAmbiguousAliases.M1:
-        result = MyGame.Example.MonsterVerify.Verify(verifier, tablePos);
-        break;
-      case AnyAmbiguousAliases.M2:
-        result = MyGame.Example.MonsterVerify.Verify(verifier, tablePos);
-        break;
-      case AnyAmbiguousAliases.M3:
-        result = MyGame.Example.MonsterVerify.Verify(verifier, tablePos);
-        break;
-      default: result = true;
-        break;
-    }
-    return result;
-  }
-}
-
 public class AnyAmbiguousAliasesUnion_JsonConverter : Newtonsoft.Json.JsonConverter {
   public override bool CanConvert(System.Type objectType) {
     return objectType == typeof(AnyAmbiguousAliasesUnion) || objectType == typeof(System.Collections.Generic.List<AnyAmbiguousAliasesUnion>);
@@ -110,4 +85,29 @@
 }
 
 
+
+static public class AnyAmbiguousAliasesVerify
+{
+  static public bool Verify(Google.FlatBuffers.Verifier verifier, byte typeId, uint tablePos)
+  {
+    bool result = true;
+    switch((AnyAmbiguousAliases)typeId)
+    {
+      case AnyAmbiguousAliases.M1:
+        result = MyGame.Example.MonsterVerify.Verify(verifier, tablePos);
+        break;
+      case AnyAmbiguousAliases.M2:
+        result = MyGame.Example.MonsterVerify.Verify(verifier, tablePos);
+        break;
+      case AnyAmbiguousAliases.M3:
+        result = MyGame.Example.MonsterVerify.Verify(verifier, tablePos);
+        break;
+      default: result = true;
+        break;
+    }
+    return result;
+  }
+}
+
+
 }
diff --git a/tests/MyGame/Example/AnyUniqueAliases.cs b/tests/MyGame/Example/AnyUniqueAliases.cs
index 629edb6..099046d 100644
--- a/tests/MyGame/Example/AnyUniqueAliases.cs
+++ b/tests/MyGame/Example/AnyUniqueAliases.cs
@@ -41,31 +41,6 @@
   }
 }
 
-
-
-static public class AnyUniqueAliasesVerify
-{
-  static public bool Verify(Google.FlatBuffers.Verifier verifier, byte typeId, uint tablePos)
-  {
-    bool result = true;
-    switch((AnyUniqueAliases)typeId)
-    {
-      case AnyUniqueAliases.M:
-        result = MyGame.Example.MonsterVerify.Verify(verifier, tablePos);
-        break;
-      case AnyUniqueAliases.TS:
-        result = MyGame.Example.TestSimpleTableWithEnumVerify.Verify(verifier, tablePos);
-        break;
-      case AnyUniqueAliases.M2:
-        result = MyGame.Example2.MonsterVerify.Verify(verifier, tablePos);
-        break;
-      default: result = true;
-        break;
-    }
-    return result;
-  }
-}
-
 public class AnyUniqueAliasesUnion_JsonConverter : Newtonsoft.Json.JsonConverter {
   public override bool CanConvert(System.Type objectType) {
     return objectType == typeof(AnyUniqueAliasesUnion) || objectType == typeof(System.Collections.Generic.List<AnyUniqueAliasesUnion>);
@@ -110,4 +85,29 @@
 }
 
 
+
+static public class AnyUniqueAliasesVerify
+{
+  static public bool Verify(Google.FlatBuffers.Verifier verifier, byte typeId, uint tablePos)
+  {
+    bool result = true;
+    switch((AnyUniqueAliases)typeId)
+    {
+      case AnyUniqueAliases.M:
+        result = MyGame.Example.MonsterVerify.Verify(verifier, tablePos);
+        break;
+      case AnyUniqueAliases.TS:
+        result = MyGame.Example.TestSimpleTableWithEnumVerify.Verify(verifier, tablePos);
+        break;
+      case AnyUniqueAliases.M2:
+        result = MyGame.Example2.MonsterVerify.Verify(verifier, tablePos);
+        break;
+      default: result = true;
+        break;
+    }
+    return result;
+  }
+}
+
+
 }
diff --git a/tests/namespace_test/NamespaceA/NamespaceB/UnionInNestedNS.cs b/tests/namespace_test/NamespaceA/NamespaceB/UnionInNestedNS.cs
index 8105c3b..f44cd90 100644
--- a/tests/namespace_test/NamespaceA/NamespaceB/UnionInNestedNS.cs
+++ b/tests/namespace_test/NamespaceA/NamespaceB/UnionInNestedNS.cs
@@ -33,25 +33,6 @@
   }
 }
 
-
-
-static public class UnionInNestedNSVerify
-{
-  static public bool Verify(Google.FlatBuffers.Verifier verifier, byte typeId, uint tablePos)
-  {
-    bool result = true;
-    switch((UnionInNestedNS)typeId)
-    {
-      case UnionInNestedNS.TableInNestedNS:
-        result = NamespaceA.NamespaceB.TableInNestedNSVerify.Verify(verifier, tablePos);
-        break;
-      default: result = true;
-        break;
-    }
-    return result;
-  }
-}
-
 public class UnionInNestedNSUnion_JsonConverter : Newtonsoft.Json.JsonConverter {
   public override bool CanConvert(System.Type objectType) {
     return objectType == typeof(UnionInNestedNSUnion) || objectType == typeof(System.Collections.Generic.List<UnionInNestedNSUnion>);
@@ -94,4 +75,23 @@
 }
 
 
+
+static public class UnionInNestedNSVerify
+{
+  static public bool Verify(Google.FlatBuffers.Verifier verifier, byte typeId, uint tablePos)
+  {
+    bool result = true;
+    switch((UnionInNestedNS)typeId)
+    {
+      case UnionInNestedNS.TableInNestedNS:
+        result = NamespaceA.NamespaceB.TableInNestedNSVerify.Verify(verifier, tablePos);
+        break;
+      default: result = true;
+        break;
+    }
+    return result;
+  }
+}
+
+
 }
diff --git a/tests/union_value_collsion/union_value_collision_generated.cs b/tests/union_value_collsion/union_value_collision_generated.cs
index 7a38e86..e741e9a 100644
--- a/tests/union_value_collsion/union_value_collision_generated.cs
+++ b/tests/union_value_collsion/union_value_collision_generated.cs
@@ -37,25 +37,6 @@
   }
 }
 
-
-
-static public class ValueVerify
-{
-  static public bool Verify(Google.FlatBuffers.Verifier verifier, byte typeId, uint tablePos)
-  {
-    bool result = true;
-    switch((Value)typeId)
-    {
-      case Value.IntValue:
-        result = union_value_collsion.IntValueVerify.Verify(verifier, tablePos);
-        break;
-      default: result = true;
-        break;
-    }
-    return result;
-  }
-}
-
 public class ValueUnion_JsonConverter : Newtonsoft.Json.JsonConverter {
   public override bool CanConvert(System.Type objectType) {
     return objectType == typeof(ValueUnion) || objectType == typeof(System.Collections.Generic.List<ValueUnion>);
@@ -97,6 +78,25 @@
   }
 }
 
+
+
+static public class ValueVerify
+{
+  static public bool Verify(Google.FlatBuffers.Verifier verifier, byte typeId, uint tablePos)
+  {
+    bool result = true;
+    switch((Value)typeId)
+    {
+      case Value.IntValue:
+        result = union_value_collsion.IntValueVerify.Verify(verifier, tablePos);
+        break;
+      default: result = true;
+        break;
+    }
+    return result;
+  }
+}
+
 [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))]
 public enum Other : byte
 {
@@ -125,25 +125,6 @@
   }
 }
 
-
-
-static public class OtherVerify
-{
-  static public bool Verify(Google.FlatBuffers.Verifier verifier, byte typeId, uint tablePos)
-  {
-    bool result = true;
-    switch((Other)typeId)
-    {
-      case Other.IntValue:
-        result = union_value_collsion.IntValueVerify.Verify(verifier, tablePos);
-        break;
-      default: result = true;
-        break;
-    }
-    return result;
-  }
-}
-
 public class OtherUnion_JsonConverter : Newtonsoft.Json.JsonConverter {
   public override bool CanConvert(System.Type objectType) {
     return objectType == typeof(OtherUnion) || objectType == typeof(System.Collections.Generic.List<OtherUnion>);
@@ -185,6 +166,25 @@
   }
 }
 
+
+
+static public class OtherVerify
+{
+  static public bool Verify(Google.FlatBuffers.Verifier verifier, byte typeId, uint tablePos)
+  {
+    bool result = true;
+    switch((Other)typeId)
+    {
+      case Other.IntValue:
+        result = union_value_collsion.IntValueVerify.Verify(verifier, tablePos);
+        break;
+      default: result = true;
+        break;
+    }
+    return result;
+  }
+}
+
 public struct IntValue : IFlatbufferObject
 {
   private Table __p;
diff --git a/tests/union_vector/Character.cs b/tests/union_vector/Character.cs
index f6e7c88..f2e7339 100644
--- a/tests/union_vector/Character.cs
+++ b/tests/union_vector/Character.cs
@@ -50,40 +50,6 @@
   }
 }
 
-
-
-static public class CharacterVerify
-{
-  static public bool Verify(Google.FlatBuffers.Verifier verifier, byte typeId, uint tablePos)
-  {
-    bool result = true;
-    switch((Character)typeId)
-    {
-      case Character.MuLan:
-        result = AttackerVerify.Verify(verifier, tablePos);
-        break;
-      case Character.Rapunzel:
-        result = verifier.VerifyUnionData(tablePos, 4, 4);
-        break;
-      case Character.Belle:
-        result = verifier.VerifyUnionData(tablePos, 4, 4);
-        break;
-      case Character.BookFan:
-        result = verifier.VerifyUnionData(tablePos, 4, 4);
-        break;
-      case Character.Other:
-       result = verifier.VerifyUnionString(tablePos);
-        break;
-      case Character.Unused:
-       result = verifier.VerifyUnionString(tablePos);
-        break;
-      default: result = true;
-        break;
-    }
-    return result;
-  }
-}
-
 public class CharacterUnion_JsonConverter : Newtonsoft.Json.JsonConverter {
   public override bool CanConvert(System.Type objectType) {
     return objectType == typeof(CharacterUnion) || objectType == typeof(System.Collections.Generic.List<CharacterUnion>);
@@ -130,3 +96,37 @@
   }
 }
 
+
+
+static public class CharacterVerify
+{
+  static public bool Verify(Google.FlatBuffers.Verifier verifier, byte typeId, uint tablePos)
+  {
+    bool result = true;
+    switch((Character)typeId)
+    {
+      case Character.MuLan:
+        result = AttackerVerify.Verify(verifier, tablePos);
+        break;
+      case Character.Rapunzel:
+        result = verifier.VerifyUnionData(tablePos, 4, 4);
+        break;
+      case Character.Belle:
+        result = verifier.VerifyUnionData(tablePos, 4, 4);
+        break;
+      case Character.BookFan:
+        result = verifier.VerifyUnionData(tablePos, 4, 4);
+        break;
+      case Character.Other:
+       result = verifier.VerifyUnionString(tablePos);
+        break;
+      case Character.Unused:
+       result = verifier.VerifyUnionString(tablePos);
+        break;
+      default: result = true;
+        break;
+    }
+    return result;
+  }
+}
+
diff --git a/tests/union_vector/Gadget.cs b/tests/union_vector/Gadget.cs
index 32f0d81..883596e 100644
--- a/tests/union_vector/Gadget.cs
+++ b/tests/union_vector/Gadget.cs
@@ -34,28 +34,6 @@
   }
 }
 
-
-
-static public class GadgetVerify
-{
-  static public bool Verify(Google.FlatBuffers.Verifier verifier, byte typeId, uint tablePos)
-  {
-    bool result = true;
-    switch((Gadget)typeId)
-    {
-      case Gadget.FallingTub:
-        result = verifier.VerifyUnionData(tablePos, 4, 4);
-        break;
-      case Gadget.HandFan:
-        result = HandFanVerify.Verify(verifier, tablePos);
-        break;
-      default: result = true;
-        break;
-    }
-    return result;
-  }
-}
-
 public class GadgetUnion_JsonConverter : Newtonsoft.Json.JsonConverter {
   public override bool CanConvert(System.Type objectType) {
     return objectType == typeof(GadgetUnion) || objectType == typeof(System.Collections.Generic.List<GadgetUnion>);
@@ -98,3 +76,25 @@
   }
 }
 
+
+
+static public class GadgetVerify
+{
+  static public bool Verify(Google.FlatBuffers.Verifier verifier, byte typeId, uint tablePos)
+  {
+    bool result = true;
+    switch((Gadget)typeId)
+    {
+      case Gadget.FallingTub:
+        result = verifier.VerifyUnionData(tablePos, 4, 4);
+        break;
+      case Gadget.HandFan:
+        result = HandFanVerify.Verify(verifier, tablePos);
+        break;
+      default: result = true;
+        break;
+    }
+    return result;
+  }
+}
+