.ToString() и .ToLower() предупреждают о культурных различиях.

Я сохраняю некоторые логические значения в виде строковых переменных сеанса, например:

HttpContext.Session.SetString("SomeBool", user.SomeBool.ToString().ToLower());

Это дает мне предупреждения о том, что результат может варьироваться в зависимости от культуры пользователей. Как это возможно? Каким образом результат ToString() или ToLower() «Верно» или «Ложь» может различаться в зависимости от культуры? Разве логические значения не всегда представлены английскими словами «True» и «False», независимо от языка и региональных параметров базы данных или среды размещения?

Я также пробовал эти три, и все они дают одно и то же предупреждение:

HttpContext.Session.SetString("SomeBool", FormattableString.Invariant($"{user.SomeBool.ToString().ToLower()}"));

HttpContext.Session.SetString("SomeBool", String.Format(CultureInfo.CurrentCulture, $"{0}", user.SomeBool.ToString().ToLower()));

HttpContext.Session.SetString("SomeBool", String.Format(CultureInfo.CurrentCulture, user.SomeBool.ToString().ToLower()));

VS предлагает отключить предупреждения CA1305, но я не хочу этого делать.

Какие-либо предложения?

Обновить

Хотя ответ VillageTech отвечает на мой вопрос, я изменил свой код, чтобы полностью избежать этой проблемы. Вдохновленный предложением Кристофера о жестком кодировании значений:

HttpContext.Session.SetString("SomeBool", user.SomeBool ? "true" : "false");

person Stian    schedule 07.12.2019    source источник


Ответы (5)


И ToString(), и ToLower() могут выдавать такие предупреждения. Использовать это:

HttpContext.Session.SetString("SomeBool", user.SomeBool.ToString(CultureInfo.CurrentCulture).ToLower(CultureInfo.CurrentCulture));
person VillageTech    schedule 07.12.2019
comment
Ах хорошо. Это работает. Но... Вау! Это невероятно громоздкий синтаксис! Вообще не очень читабельно! - person Stian; 08.12.2019
comment
Это стандартные перегрузки для ToString() и ToLower(). Например: docs.microsoft.com/dotnet /апи/ - person VillageTech; 08.12.2019
comment
Ваш ответ отвечает на мой вопрос, но, вдохновленный ответом Кристофера, я изменил свой код на этот: HttpContext.Session.SetString("SomeBool", user.SomeBool ? "true" : "false");, полностью избегая этой проблемы. - person Stian; 08.12.2019

Не храните вещи в виде строк. Возможно, строка является вторым худшим типом для обработки. Хуже только сырой бинарник.

В редком случае, когда вам нужно сохранить что-то в виде строки, вы должны обязательно выбрать одни и те же настройки культуры и кодировку на всех конечных точках. По умолчанию функции ToString() и Parse() и обычно связанные со строками функции извлекают текущую культуру и ее настройки из Windows. Это очень полезно для обычного графического интерфейса, но очень плохо для такого случая. Предупреждение именно о таких проблемах. Вместо этого жестко закодируйте один.

XML и JSON позаботятся об этом за вас. Но в этом случае вам придется делать это вручную.

person Christopher    schedule 07.12.2019
comment
Вы имеете в виду вот так: HttpContext.Session.SetString("SomeBool", user.SomeBool ? "true" : "false"); ? - person Stian; 08.12.2019
comment
@Stian Я не могу найти определение для SetString() каким бы оно ни было: docs.microsoft.com/en-us/dotnet/api/ - person Christopher; 08.12.2019
comment
Я использую .Net Core. HttpContext.Session имеет три метода установки значений — Set() (который я не использую), SetString() и SetInt32(). - person Stian; 08.12.2019

Попробуй это


 // calling getValue() method 
stringSomeBool = getValue(user.SomeBool); 

HttpContext.Session.SetString("SomeBool", stringSomeBool.ToLower()); 

    // defining getValue() method 
    public static void getValue(bool variable) 
    { 

        // getting the value of string property 
        string value = variable.ToString(); 

        // print the string property 
        Console.WriteLine("{0}", value); 
    } 
person unkn0wn95    schedule 07.12.2019

мой первый вклад: попробуйте определить его как строку, прежде чем использовать переменную следующим образом:

string convd = user.SomeBool.ToString();
convd = convd.ToLower();
HttpContext.Session.SetString("SomeBool", convd);

Это то, что я обычно делаю, надеюсь, это поможет в качестве моего первого ответа :))

person Draugr    schedule 07.12.2019

Пусть FormattableString.Invariant сделает за вас ToString():

using static System.FormattableString; 

HttpContext.Session.SetString("SomeBool", Invariant($"{user.SomeBool}").ToLower();
person jaspenlind    schedule 07.12.2019