ASP.NET Приведение типа C# Bool

#c# #asp.net #boolean

#c# #asp.net #логическое значение

Вопрос:

Этот код выдает ошибку:

     bool status1 = (bool)Cache["cache_req_head"];
    bool status2 = (bool)Cache["cache_super"];
    bool status3 = (bool)Cache["cache_head"];
  

Вот как были установлены переменные кэша:

 if (checkreqhead == true)
        {
            Cache["cache_req_head"] = true;
        }
        else if (checksuper == true)
        {
            Cache["cache_super"] = true;
        }
        else if (checkhead == true)
        {
            Cache["cache_head"] = true;
        }
  

Исходя из PHP фона, это неудобно. Ошибка:

Ссылка на объект не установлена для экземпляра объекта

Я уверен, что это что-то действительно простое, но, вероятно, я не могу это определить.

СПАСИБО ВСЕМ ЗА ПОМОЩЬ 🙂

Комментарии:

1. Кстати: значение «== true» в ваших операторах if является избыточным.

Ответ №1:

«Ссылка на объект не установлена для экземпляра объекта» на языке c # означает «вы сделали что-то глупое со null значением»

Если кэш пуст, вам нужно сначала проверить это

 bool status1 = (bool)Cache["cache_req_head"];
  

должно быть

 bool status1 = false;
if (Cache["cache_req_head"] != null)
{
   status1 = (bool)Cache["cache_req_head"];
}
  

Это следствие того факта, что типы значений (например, bool, int и т. Д.) В c # Не могут быть нулевыми. Существует оболочка Nullable<T> с сокращением T? , которую вы можете использовать, если хотите разрешить нулевые значения для типов значений.

Вы можете привести свое значение к a bool? , поскольку это позволяет null .

 bool? status1 = (bool?)Cache["cache_req_head"];
  

Затем вы можете проверить status1 == null или status1.HasValue , чтобы получить фактическое значение bool, которое вам нужно выбрать status1.Value . Если вы выберете status1.Value while status1 == null , вы получите исключение во время выполнения, подобное тому, которое вы только что получили.

Комментарии:

1. Я не пробовал это последнее, но сработает ли это? Я бы подумал, что вам нужно сказать: bool? status1 = Cache[«cache_req_head»] как bool?

2. @MikeChristensen, мой тестовый код object oBool = null; bool? nBool = oBool as bool?; Console.WriteLine(nBool); oBool = false; nBool = oBool as bool?; Console.WriteLine(nBool); , похоже, работает нормально.

3. @MikeChristensen as bool не будет работать, поскольку as T требуется T быть ссылочным типом. (как as иначе можно вернуть значение null, если тип неверен?)

4. Я не сказал как bool, я сказал «как bool?»

5. @MikeChristensen, aha. Ну, as bool? требуется только в том случае, если вы хотите обрабатывать другие типы, кроме bool, в том же ключе кэша. Кстати, посмотрите на Markdown в комментариях

Ответ №2:

На самом деле, лучший способ проверить, существует ли значение или нет Cache , — это выполнить:

 //string is used as an example; you should put the type you expect
string variable = Cache["KEY"] as string;

if(variable!=null)
{
  // do something
}
  

Причина, по которой это if(Cache["KEY"]!=null) myVariable=Cache["Key"]; небезопасно, заключается в том, что объект, хранящийся в Cache["Key"] , может быть удален Cache до того, как вы получите возможность назначить его myVariable , и вы в конечном итоге думаете, что myVariable содержит ненулевое значение.

Ответ №3:

Очевидно, что вы одновременно устанавливаете только одну из записей кэша. Поэтому, если вы не запустите код «setter» 3 раза только с 1 переменной, имеющей значение true, тогда вы всегда будете возвращать нули. null не преобразуется в bool , потому что это тип значения. Попробуйте использовать bool?

Ответ №4:

Поскольку Cache[] возвращает объект, который равен null, если не задан, то вы получаете исключение при попытке преобразовать null в bool .

Сначала вам нужно будет проверить, существует ли этот ключ, или вам придется установить для каждого ключа значение «false» по умолчанию.