Change hashtable to use OrdinalIgnoreCase to be case-insensitive in all Cultures (#8566)

Ubuntu18.04 seems to default to C.UTF-8 for LANG (representing InvariantCulture) which results in a case-sensitive hashtable since CurrentCultureIgnoreCase doesn't work for that culture. Fix is to use OrdinalIgnoreCase instead.
This commit is contained in:
Steve Lee 2019-01-09 20:11:43 -08:00 committed by Ilya
parent 1729a682ee
commit 9793ed2c68
2 changed files with 8 additions and 2 deletions

View file

@ -538,7 +538,7 @@ namespace System.Management.Automation.Language
internal static readonly Expression CompareOptionsNone = Expression.Constant(CompareOptions.None);
internal static readonly Expression Ordinal = Expression.Constant(StringComparison.Ordinal);
internal static readonly Expression InvariantCulture = Expression.Constant(CultureInfo.InvariantCulture);
internal static readonly Expression CurrentCultureIgnoreCaseComparer = Expression.Constant(StringComparer.CurrentCultureIgnoreCase, typeof(StringComparer));
internal static readonly Expression OrdinalIgnoreCaseComparer = Expression.Constant(StringComparer.OrdinalIgnoreCase, typeof(StringComparer));
internal static readonly Expression CatchAllType = Expression.Constant(typeof(ExceptionHandlingOps.CatchAll), typeof(Type));
internal static readonly Expression Empty = Expression.Empty();
internal static Expression GetExecutionContextFromTLS =
@ -5756,7 +5756,7 @@ namespace System.Management.Automation.Language
yield return Expression.Assign(temp,
Expression.New(ordered ? CachedReflectionInfo.OrderedDictionary_ctor : CachedReflectionInfo.Hashtable_ctor,
ExpressionCache.Constant(keyValuePairs.Count),
ExpressionCache.CurrentCultureIgnoreCaseComparer.Cast(typeof(IEqualityComparer))));
ExpressionCache.OrdinalIgnoreCaseComparer.Cast(typeof(IEqualityComparer))));
for (int index = 0; index < keyValuePairs.Count; index++)
{
var keyValuePair = keyValuePairs[index];

View file

@ -303,3 +303,9 @@ Describe "Hash expression with if statement as value" -Tags "CI" {
$hash['h'] | Should -BeExactly 'h'
}
}
Describe "Hashtable is case insensitive" -Tag CI {
It "When LANG is C.UTF-8" -Skip:($IsWindows) {
sh -c 'LANG=C.UTF-8 pwsh -NoProfile -Command ''$h=@{p=1};$h.P''' | Should -Be 1
}
}