KEMBAR78
[dotnet-sdk-8.0.100-alpha.1.23067.5 ] When second parameter is bool for Enum.ToObject() method, it throws System.ArgumentException: 'The value passed in must be an enum base or an underlying type for an enum, such as an Int32.' exception · Issue #80890 · dotnet/runtime · GitHub
Skip to content

[dotnet-sdk-8.0.100-alpha.1.23067.5 ] When second parameter is bool for Enum.ToObject() method, it throws System.ArgumentException: 'The value passed in must be an enum base or an underlying type for an enum, such as an Int32.' exception #80890

@Junjun-zhao

Description

@Junjun-zhao

Description

When testing the 3rd party App Dapper against latest .NET 8 runtime, it throws System.ArgumentException: 'The value passed in must be an enum base or an underlying type for an enum, such as an Int32.' exception when second parameter is bool for Enum.ToObject() method.

Application Name: Dapper
OS: Windows 10 21H2
CPU: X64
.NET Build Number: dotnet-sdk-8.0.100-alpha.1.23067.5
App or App Source Checking at : https://devdiv.visualstudio.com/DevDiv/_workitems/edit/1726914
Github Link: https://github.com/DapperLib/Dapper

Reproduction Steps

Minimal Repro sample:
Minimal repro sample attached.
ConsoleApp1.zip

  1. Create a .NET 7.0 Console application
  2. Add following code in Program.cs file:
      internal class Program
{
    private static void Main(string[] args)
    {
        Console.WriteLine("Hello, World!");

        object obj = Enum.ToObject(typeof(E_Int), true); //If we change the "true" to "1", the issue will go
    }
}
enum E_Int : int { A = 0, B = 1 }
  1. Build the project.
  2. Change the runtimeconfig to let the app run against with .NET 8.0.100-alpha.1.23067.5:
{
  "runtimeOptions": {
    "tfm": "net7.0",
    "framework": {
      "name": "Microsoft.NETCore.App",
      "version": "8.0.0-alpha.1.23067.11"
    }
  }
}
  1. Press F5 to launch the sample app.

Expected behavior

App can launch without exception.

Actual behavior

This exception is thrown in code:

Unhandled exception. System.ArgumentException: The value passed in must be an enum base or an underlying type for an enum, such as an Int32. (Parameter 'value')
   at System.Enum.ToObject(Type enumType, Object value)

Regression?

Verify Scenarios:

1). Windows10 21H2 x64+dotnet-sdk-8.0.100-alpha.1.23068.16: Fail
2). Windows10 21H2 x64+dotnet-sdk-8.0.100-alpha.1.23067.5: Fail
3). Windows10 21H2 x64+dotnet-sdk-8.0.100-alpha.1.23063.11: Pass
4). Windows 10 21H2 x64 + dotnet-sdk-7.0.101: Pass

Known Workarounds

No response

Configuration

Dotnet Info:
.NET SDK:
 Version:   8.0.100-alpha.1.23068.16
 Commit:    e1c9ddb5cc

Runtime Environment:
 OS Name:     Windows
 OS Version:  10.0.19045
 OS Platform: Windows
 RID:         win10-x64
 Base Path:   C:\Program Files\dotnet\sdk\8.0.100-alpha.1.23068.16\

Host:
  Version:      8.0.0-alpha.1.23067.11
  Architecture: x64
  Commit:       19fc478d67

.NET SDKs installed:
  8.0.100-alpha.1.23068.16 [C:\Program Files\dotnet\sdk]

.NET runtimes installed:
  Microsoft.AspNetCore.App 8.0.0-alpha.1.23068.1 [C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 8.0.0-alpha.1.23067.11 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App]
  Microsoft.WindowsDesktop.App 8.0.0-alpha.1.23067.2 [C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App]

Other information

Findings:
According to the document for Enum.ToObject(Type, Object), the ArgumentException will be thrown when object value is not type SByte, Int16, Int32, Int64, Byte, UInt16, UInt32, or UInt64. Before .NET 8.0.100-alpha.1.23067.5, it can accept bool value and convert it to an enumeration member. But start from .NET 8.0.100-alpha.1.23067.5, the bool value is not be accepted.
If we change the Enum.ToObject() method's second parameter from "true" to "1", the demo will pass without any issue. Only the second parameter is bool value will cause this issue.

Repro steps for app:
The machine only has 8.0 installed. And DOTNET_ROLL_FORWARD_ON_NO_CANDIDATE_FX=2 is set.
Copy DapperTest01 app to local machine.
Open command line prompt window and navigate to where the Dapper.Tests.dll located in.
Run "dotnet vstest Dapper.Tests.dll /tests:TestBigIntForEverythingWorks" command to execute the tests.
Expected Result:
All test cases will pass.

Actual Result:
The test cases are failed with following error:

[xUnit.net 00:00:01.17]     SystemSqlClientTypeHandlerTests.TestBigIntForEverythingWorks [FAIL]
[xUnit.net 00:00:01.38]     MicrosoftSqlClientTypeHandlerTests.TestBigIntForEverythingWorks [FAIL]
  Failed SystemSqlClientTypeHandlerTests.TestBigIntForEverythingWorks [461 ms]

Error Message:

   System.ArgumentException : The value passed in must be an enum base or an underlying type for an enum, such as an Int32. (Parameter 'value')
  Stack Trace:
     at System.Enum.ToObject(Type enumType, Object value)
   at Dapper.SqlMapper.<>c__DisplayClass201_0.<GetStructDeserializer>b__3(IDataReader r) in C:\Users\v-zhiyang\Desktop\Dapper\Dapper\SqlMapper.cs:line 2962
   at Dapper.SqlMapper.QueryImpl[T](IDbConnection cnn, CommandDefinition command, Type effectiveType)+MoveNext() in C:\Users\v-zhiyang\Desktop\Dapper\Dapper\SqlMapper.cs:line 1113
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at Dapper.SqlMapper.Query[T](IDbConnection cnn, String sql, Object param, IDbTransaction transaction, Boolean buffered, Nullable`1 commandTimeout, Nullable`1 commandType) in C:\Users\v-zhiyang\Desktop\Dapper\Dapper\SqlMapper.cs:line 734
   at Dapper.Tests.TypeHandlerTests`1.TestBigIntForEverythingWorksGeneric[T](T expected, String dbType)
   at Dapper.Tests.TypeHandlerTests`1.TestBigIntForEverythingWorks_ByDataType[T](String dbType)
   at Dapper.Tests.TypeHandlerTests`1.TestBigIntForEverythingWorks()
   at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor)
   at System.Reflection.MethodInvoker.Invoke(Object obj, IntPtr* args, BindingFlags invokeAttr)
  Failed MicrosoftSqlClientTypeHandlerTests.TestBigIntForEverythingWorks [202 ms]
  Error Message:
   System.ArgumentException : The value passed in must be an enum base or an underlying type for an enum, such as an Int32. (Parameter 'value')
  Stack Trace:
     at System.Enum.ToObject(Type enumType, Object value)
   at Dapper.SqlMapper.<>c__DisplayClass201_0.<GetStructDeserializer>b__3(IDataReader r) in C:\Users\v-zhiyang\Desktop\Dapper\Dapper\SqlMapper.cs:line 2962
   at Dapper.SqlMapper.QueryImpl[T](IDbConnection cnn, CommandDefinition command, Type effectiveType)+MoveNext() in C:\Users\v-zhiyang\Desktop\Dapper\Dapper\SqlMapper.cs:line 1113
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at Dapper.SqlMapper.Query[T](IDbConnection cnn, String sql, Object param, IDbTransaction transaction, Boolean buffered, Nullable`1 commandTimeout, Nullable`1 commandType) in C:\Users\v-zhiyang\Desktop\Dapper\Dapper\SqlMapper.cs:line 734
   at Dapper.Tests.TypeHandlerTests`1.TestBigIntForEverythingWorksGeneric[T](T expected, String dbType)
   at Dapper.Tests.TypeHandlerTests`1.TestBigIntForEverythingWorks_ByDataType[T](String dbType)
   at Dapper.Tests.TypeHandlerTests`1.TestBigIntForEverythingWorks()
   at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor)
   at System.Reflection.MethodInvoker.Invoke(Object obj, IntPtr* args, BindingFlags invokeAttr)

Failed!  - Failed:     2, Passed:     0, Skipped:     0, Total:     2, Duration: 200 ms - Dapper.Tests.dll (net5.0)

@dotnet-actwx-bot @dotnet/compat

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions