-
Notifications
You must be signed in to change notification settings - Fork 5.2k
Description
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
- Create a .NET 7.0 Console application
- 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 }
- Build the project.
- 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"
}
}
}
- 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