diff --git a/src/libraries/System.Linq/src/System/Linq/DefaultIfEmpty.SpeedOpt.cs b/src/libraries/System.Linq/src/System/Linq/DefaultIfEmpty.SpeedOpt.cs index c89d6797581e9b..d5d098e03f6b13 100644 --- a/src/libraries/System.Linq/src/System/Linq/DefaultIfEmpty.SpeedOpt.cs +++ b/src/libraries/System.Linq/src/System/Linq/DefaultIfEmpty.SpeedOpt.cs @@ -1,6 +1,7 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System; using System.Collections; using System.Collections.Generic; @@ -77,9 +78,10 @@ public override int GetCount(bool onlyIfCheap) if (index == 0) { found = true; + return _default; } - return _default; + return default; } } } diff --git a/src/libraries/System.Linq/tests/DefaultIfEmptyTests.cs b/src/libraries/System.Linq/tests/DefaultIfEmptyTests.cs index 3dadd6d679378e..f128afc41d8183 100644 --- a/src/libraries/System.Linq/tests/DefaultIfEmptyTests.cs +++ b/src/libraries/System.Linq/tests/DefaultIfEmptyTests.cs @@ -124,5 +124,36 @@ public void First_Last_ElementAt() Assert.Equal(42, empty.DefaultIfEmpty(42).ElementAt(0)); Assert.Throws(() => empty.DefaultIfEmpty(42).ElementAt(1)); } + + [Fact] + public void ElementAtOrDefault_OutOfBounds_ReturnsTypeDefault() + { + // Regression test for https://github.com/dotnet/runtime/issues/119834 + // ElementAtOrDefault should return default(T) for out-of-bounds indices, + // not the DefaultIfEmpty default value + + // Test with empty source + int[] empty = []; + var defaultIfEmpty = empty.DefaultIfEmpty(999); + + // Index 0 should return the DefaultIfEmpty value (999) + Assert.Equal(999, defaultIfEmpty.ElementAtOrDefault(0)); + + // Out-of-bounds indices should return default(int) which is 0, not 999 + Assert.Equal(0, defaultIfEmpty.ElementAtOrDefault(1)); + Assert.Equal(0, defaultIfEmpty.ElementAtOrDefault(2)); + Assert.Equal(0, defaultIfEmpty.ElementAtOrDefault(-1)); + + // Test with different type (string) + string[] emptyStrings = []; + var defaultIfEmptyString = emptyStrings.DefaultIfEmpty("default"); + + // Index 0 should return the DefaultIfEmpty value + Assert.Equal("default", defaultIfEmptyString.ElementAtOrDefault(0)); + + // Out-of-bounds indices should return default(string) which is null + Assert.Null(defaultIfEmptyString.ElementAtOrDefault(1)); + Assert.Null(defaultIfEmptyString.ElementAtOrDefault(2)); + } } }