Does nullcheck really work on a statebag?










1















public long MetaExtraData

get return (long)(ViewState["MetaData"] ?? 0);
set ViewState["MetaData"] = value;



When ViewBag doesn't contains the key 'MetaData' I get back a "can't cast to long" exception. Isn't the whole idea with ?? to handle this?



And of course, the below snippet will also throw a cast error. When checking the values of the variables: o=null



public long MetaExtraDataInt

get

object o = ViewState["MetaData"];
return (long)(o ?? 0);

set ViewState["MetaData"] = value;



I know the problem is easy to solve, but I really do want to know why the ?? don't work on a statebag










share|improve this question



















  • 1





    No, you could try to use ViewState["MetaDataInt"] as int? ?? 0 instead.

    – Sebastian Hofmann
    Nov 13 '18 at 9:55







  • 1





    Is it possible that ViewState[...] returns DbNull instead of null?

    – HimBromBeere
    Nov 13 '18 at 10:05






  • 1





    What is the value of ViewState["MetaDataInt"] when the exception is thrown? Also ViewState["MetaDataInt"].GetType(). You can check both in the Immediate Window.

    – mjwills
    Nov 13 '18 at 10:10






  • 1





    Please don't guess - check in the Immediate Window.

    – mjwills
    Nov 13 '18 at 10:15












  • thank you @mjwills, when trying to call ViewState["MetaDataInt"].GetType() I receive a null pointer exception and when just trying ViewState["MetaDataInt"] it is "null"

    – stebberg
    Nov 13 '18 at 11:04















1















public long MetaExtraData

get return (long)(ViewState["MetaData"] ?? 0);
set ViewState["MetaData"] = value;



When ViewBag doesn't contains the key 'MetaData' I get back a "can't cast to long" exception. Isn't the whole idea with ?? to handle this?



And of course, the below snippet will also throw a cast error. When checking the values of the variables: o=null



public long MetaExtraDataInt

get

object o = ViewState["MetaData"];
return (long)(o ?? 0);

set ViewState["MetaData"] = value;



I know the problem is easy to solve, but I really do want to know why the ?? don't work on a statebag










share|improve this question



















  • 1





    No, you could try to use ViewState["MetaDataInt"] as int? ?? 0 instead.

    – Sebastian Hofmann
    Nov 13 '18 at 9:55







  • 1





    Is it possible that ViewState[...] returns DbNull instead of null?

    – HimBromBeere
    Nov 13 '18 at 10:05






  • 1





    What is the value of ViewState["MetaDataInt"] when the exception is thrown? Also ViewState["MetaDataInt"].GetType(). You can check both in the Immediate Window.

    – mjwills
    Nov 13 '18 at 10:10






  • 1





    Please don't guess - check in the Immediate Window.

    – mjwills
    Nov 13 '18 at 10:15












  • thank you @mjwills, when trying to call ViewState["MetaDataInt"].GetType() I receive a null pointer exception and when just trying ViewState["MetaDataInt"] it is "null"

    – stebberg
    Nov 13 '18 at 11:04













1












1








1








public long MetaExtraData

get return (long)(ViewState["MetaData"] ?? 0);
set ViewState["MetaData"] = value;



When ViewBag doesn't contains the key 'MetaData' I get back a "can't cast to long" exception. Isn't the whole idea with ?? to handle this?



And of course, the below snippet will also throw a cast error. When checking the values of the variables: o=null



public long MetaExtraDataInt

get

object o = ViewState["MetaData"];
return (long)(o ?? 0);

set ViewState["MetaData"] = value;



I know the problem is easy to solve, but I really do want to know why the ?? don't work on a statebag










share|improve this question
















public long MetaExtraData

get return (long)(ViewState["MetaData"] ?? 0);
set ViewState["MetaData"] = value;



When ViewBag doesn't contains the key 'MetaData' I get back a "can't cast to long" exception. Isn't the whole idea with ?? to handle this?



And of course, the below snippet will also throw a cast error. When checking the values of the variables: o=null



public long MetaExtraDataInt

get

object o = ViewState["MetaData"];
return (long)(o ?? 0);

set ViewState["MetaData"] = value;



I know the problem is easy to solve, but I really do want to know why the ?? don't work on a statebag







c# asp.net






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 13 '18 at 12:52









Doctor Jones

17.4k116391




17.4k116391










asked Nov 13 '18 at 9:52









stebbergstebberg

134




134







  • 1





    No, you could try to use ViewState["MetaDataInt"] as int? ?? 0 instead.

    – Sebastian Hofmann
    Nov 13 '18 at 9:55







  • 1





    Is it possible that ViewState[...] returns DbNull instead of null?

    – HimBromBeere
    Nov 13 '18 at 10:05






  • 1





    What is the value of ViewState["MetaDataInt"] when the exception is thrown? Also ViewState["MetaDataInt"].GetType(). You can check both in the Immediate Window.

    – mjwills
    Nov 13 '18 at 10:10






  • 1





    Please don't guess - check in the Immediate Window.

    – mjwills
    Nov 13 '18 at 10:15












  • thank you @mjwills, when trying to call ViewState["MetaDataInt"].GetType() I receive a null pointer exception and when just trying ViewState["MetaDataInt"] it is "null"

    – stebberg
    Nov 13 '18 at 11:04












  • 1





    No, you could try to use ViewState["MetaDataInt"] as int? ?? 0 instead.

    – Sebastian Hofmann
    Nov 13 '18 at 9:55







  • 1





    Is it possible that ViewState[...] returns DbNull instead of null?

    – HimBromBeere
    Nov 13 '18 at 10:05






  • 1





    What is the value of ViewState["MetaDataInt"] when the exception is thrown? Also ViewState["MetaDataInt"].GetType(). You can check both in the Immediate Window.

    – mjwills
    Nov 13 '18 at 10:10






  • 1





    Please don't guess - check in the Immediate Window.

    – mjwills
    Nov 13 '18 at 10:15












  • thank you @mjwills, when trying to call ViewState["MetaDataInt"].GetType() I receive a null pointer exception and when just trying ViewState["MetaDataInt"] it is "null"

    – stebberg
    Nov 13 '18 at 11:04







1




1





No, you could try to use ViewState["MetaDataInt"] as int? ?? 0 instead.

– Sebastian Hofmann
Nov 13 '18 at 9:55






No, you could try to use ViewState["MetaDataInt"] as int? ?? 0 instead.

– Sebastian Hofmann
Nov 13 '18 at 9:55





1




1





Is it possible that ViewState[...] returns DbNull instead of null?

– HimBromBeere
Nov 13 '18 at 10:05





Is it possible that ViewState[...] returns DbNull instead of null?

– HimBromBeere
Nov 13 '18 at 10:05




1




1





What is the value of ViewState["MetaDataInt"] when the exception is thrown? Also ViewState["MetaDataInt"].GetType(). You can check both in the Immediate Window.

– mjwills
Nov 13 '18 at 10:10





What is the value of ViewState["MetaDataInt"] when the exception is thrown? Also ViewState["MetaDataInt"].GetType(). You can check both in the Immediate Window.

– mjwills
Nov 13 '18 at 10:10




1




1





Please don't guess - check in the Immediate Window.

– mjwills
Nov 13 '18 at 10:15






Please don't guess - check in the Immediate Window.

– mjwills
Nov 13 '18 at 10:15














thank you @mjwills, when trying to call ViewState["MetaDataInt"].GetType() I receive a null pointer exception and when just trying ViewState["MetaDataInt"] it is "null"

– stebberg
Nov 13 '18 at 11:04





thank you @mjwills, when trying to call ViewState["MetaDataInt"].GetType() I receive a null pointer exception and when just trying ViewState["MetaDataInt"] it is "null"

– stebberg
Nov 13 '18 at 11:04












3 Answers
3






active

oldest

votes


















1














If (int)(ViewState["MetaDataInt"] ?? 0) is throwing an InvalidCastException, it must be because your value in the statebag isn't an int.



This is because:




a boxed T can only be unboxed to T (or Nullable.) Once it is
unboxed, it’s just a value that can be cast as usual.




The above quote is taken from Representation and Identity by Eric Lippert, which I recommend you read.



So if you are storing a type that is anything other than int or int? in your "MetaDataInt" statebag entry, you will get an invalid cast exception, even if that value is something that could cast to int.



For example, if it contains a decimal, then you can only unbox it as a decimal. After that, you can cast as you normally would.



The following will work in the example scenario of unboxing a decimal:



return (int)(decimal)(ViewState["MetaDataInt"] ?? 0)


I suggest you look at the type of ViewState["MetaDataInt"] in the debugger, and alter your cast accordingly.



Edit:



I can see what's going on. In your screenshot, you're attempting to unbox to a long, but your coalesced zero is an int. This is why you're getting an exception.



The following will fix your specific problem.



return (long)(ViewState["ParentID"] ?? 0L)


Note the 0L, this is how you write a long as a numeric literal.



You're having the issue because you're coalescing the 0 int with a null object, so the result of that coalesce is also an object, in this case a boxed int. A boxed int can only be unboxed to an int, but you're attempting to unbox it to a long. We fix this by boxing a 0 long instead, so you can unbox it to a long.






share|improve this answer

























  • @[doctor jones] You're so right, it would be nicer to have a null point exception. But I promise you ;) check my debug, I don't have the key in my collection: dropbox.com/s/pguvim5ky2qdvzg/…

    – stebberg
    Nov 13 '18 at 12:19












  • @stebberg, I have updated my answer based on your feedback

    – Doctor Jones
    Nov 13 '18 at 12:47











  • Here is working example of the behavior dotnetfiddle.net/UPjorI

    – Jodrell
    Nov 13 '18 at 13:02











  • @stebberg Here is an even more applicable version dotnetfiddle.net/sm2SfU

    – Jodrell
    Nov 13 '18 at 13:07












  • hmm... that's so strange! As @DoctorJones says converting the second part to long will do it long l = (long)(ViewState["ParentID"] ?? Convert.ToInt64(0)); or of course as suggested nicer long l = (long)(ViewState["ParentID"] ?? 0L); To be honest I still don't understand why this works, I have to read your answer again and really think this through.. MANY thanks @DoctorJones

    – stebberg
    Nov 14 '18 at 7:30



















2














Use Nullable<int> property instead of normal int to cast with null-coalescing operator:



public int? MetaExtraDataInt

get return (int?)ViewState["MetaDataInt"] ?? 0;
set ViewState["MetaDataInt"] = value;



Based from operator precedence, the null-coalescing is performed after cast to Nullable<int>, so that it returns zero when ViewState["MetaDataInt"] contains null value.






share|improve this answer

























  • thank you Tetsuya, but I need to have this property as int and not int?

    – stebberg
    Nov 13 '18 at 10:07











  • It depends on how you want to use it, I recommends Nullable<int> as return type if you want to contain null values, otherwise int should be enough.

    – Tetsuya Yamamoto
    Nov 13 '18 at 10:08











  • hmm, but I don't want to cast a null to an int, that's why I have the ?? check first and then I do the cast

    – stebberg
    Nov 13 '18 at 10:42











  • I honestly don't think the null-check and the convert is in the wrong order here, Unless the ?? messes up how the logic of parentheses works of course

    – stebberg
    Nov 13 '18 at 11:18











  • Many thanks @Jodrell I actually have no problem to solve the problem, I just want to know why ?? don't work on a statebag

    – stebberg
    Nov 13 '18 at 11:19


















-2














Does it work when ViewBag contains the key? Try to cast the viewstate return like:



get return (int)(ViewState["MetaDataInt"]) ?? 0); 





share|improve this answer























  • (int)(ViewState["MetaDataInt"]) never returns null, because when ViewState["MetaDataInt"] returns null, a InvalidOpertationException is thrown when casting to int.

    – HimBromBeere
    Nov 13 '18 at 10:04











  • Yes it works great when ViewBag contains the value.

    – stebberg
    Nov 13 '18 at 10:08










Your Answer






StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");

StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);

else
createEditor();

);

function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);



);













draft saved

draft discarded


















StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53278234%2fdoes-nullcheck-really-work-on-a-statebag%23new-answer', 'question_page');

);

Post as a guest















Required, but never shown

























3 Answers
3






active

oldest

votes








3 Answers
3






active

oldest

votes









active

oldest

votes






active

oldest

votes









1














If (int)(ViewState["MetaDataInt"] ?? 0) is throwing an InvalidCastException, it must be because your value in the statebag isn't an int.



This is because:




a boxed T can only be unboxed to T (or Nullable.) Once it is
unboxed, it’s just a value that can be cast as usual.




The above quote is taken from Representation and Identity by Eric Lippert, which I recommend you read.



So if you are storing a type that is anything other than int or int? in your "MetaDataInt" statebag entry, you will get an invalid cast exception, even if that value is something that could cast to int.



For example, if it contains a decimal, then you can only unbox it as a decimal. After that, you can cast as you normally would.



The following will work in the example scenario of unboxing a decimal:



return (int)(decimal)(ViewState["MetaDataInt"] ?? 0)


I suggest you look at the type of ViewState["MetaDataInt"] in the debugger, and alter your cast accordingly.



Edit:



I can see what's going on. In your screenshot, you're attempting to unbox to a long, but your coalesced zero is an int. This is why you're getting an exception.



The following will fix your specific problem.



return (long)(ViewState["ParentID"] ?? 0L)


Note the 0L, this is how you write a long as a numeric literal.



You're having the issue because you're coalescing the 0 int with a null object, so the result of that coalesce is also an object, in this case a boxed int. A boxed int can only be unboxed to an int, but you're attempting to unbox it to a long. We fix this by boxing a 0 long instead, so you can unbox it to a long.






share|improve this answer

























  • @[doctor jones] You're so right, it would be nicer to have a null point exception. But I promise you ;) check my debug, I don't have the key in my collection: dropbox.com/s/pguvim5ky2qdvzg/…

    – stebberg
    Nov 13 '18 at 12:19












  • @stebberg, I have updated my answer based on your feedback

    – Doctor Jones
    Nov 13 '18 at 12:47











  • Here is working example of the behavior dotnetfiddle.net/UPjorI

    – Jodrell
    Nov 13 '18 at 13:02











  • @stebberg Here is an even more applicable version dotnetfiddle.net/sm2SfU

    – Jodrell
    Nov 13 '18 at 13:07












  • hmm... that's so strange! As @DoctorJones says converting the second part to long will do it long l = (long)(ViewState["ParentID"] ?? Convert.ToInt64(0)); or of course as suggested nicer long l = (long)(ViewState["ParentID"] ?? 0L); To be honest I still don't understand why this works, I have to read your answer again and really think this through.. MANY thanks @DoctorJones

    – stebberg
    Nov 14 '18 at 7:30
















1














If (int)(ViewState["MetaDataInt"] ?? 0) is throwing an InvalidCastException, it must be because your value in the statebag isn't an int.



This is because:




a boxed T can only be unboxed to T (or Nullable.) Once it is
unboxed, it’s just a value that can be cast as usual.




The above quote is taken from Representation and Identity by Eric Lippert, which I recommend you read.



So if you are storing a type that is anything other than int or int? in your "MetaDataInt" statebag entry, you will get an invalid cast exception, even if that value is something that could cast to int.



For example, if it contains a decimal, then you can only unbox it as a decimal. After that, you can cast as you normally would.



The following will work in the example scenario of unboxing a decimal:



return (int)(decimal)(ViewState["MetaDataInt"] ?? 0)


I suggest you look at the type of ViewState["MetaDataInt"] in the debugger, and alter your cast accordingly.



Edit:



I can see what's going on. In your screenshot, you're attempting to unbox to a long, but your coalesced zero is an int. This is why you're getting an exception.



The following will fix your specific problem.



return (long)(ViewState["ParentID"] ?? 0L)


Note the 0L, this is how you write a long as a numeric literal.



You're having the issue because you're coalescing the 0 int with a null object, so the result of that coalesce is also an object, in this case a boxed int. A boxed int can only be unboxed to an int, but you're attempting to unbox it to a long. We fix this by boxing a 0 long instead, so you can unbox it to a long.






share|improve this answer

























  • @[doctor jones] You're so right, it would be nicer to have a null point exception. But I promise you ;) check my debug, I don't have the key in my collection: dropbox.com/s/pguvim5ky2qdvzg/…

    – stebberg
    Nov 13 '18 at 12:19












  • @stebberg, I have updated my answer based on your feedback

    – Doctor Jones
    Nov 13 '18 at 12:47











  • Here is working example of the behavior dotnetfiddle.net/UPjorI

    – Jodrell
    Nov 13 '18 at 13:02











  • @stebberg Here is an even more applicable version dotnetfiddle.net/sm2SfU

    – Jodrell
    Nov 13 '18 at 13:07












  • hmm... that's so strange! As @DoctorJones says converting the second part to long will do it long l = (long)(ViewState["ParentID"] ?? Convert.ToInt64(0)); or of course as suggested nicer long l = (long)(ViewState["ParentID"] ?? 0L); To be honest I still don't understand why this works, I have to read your answer again and really think this through.. MANY thanks @DoctorJones

    – stebberg
    Nov 14 '18 at 7:30














1












1








1







If (int)(ViewState["MetaDataInt"] ?? 0) is throwing an InvalidCastException, it must be because your value in the statebag isn't an int.



This is because:




a boxed T can only be unboxed to T (or Nullable.) Once it is
unboxed, it’s just a value that can be cast as usual.




The above quote is taken from Representation and Identity by Eric Lippert, which I recommend you read.



So if you are storing a type that is anything other than int or int? in your "MetaDataInt" statebag entry, you will get an invalid cast exception, even if that value is something that could cast to int.



For example, if it contains a decimal, then you can only unbox it as a decimal. After that, you can cast as you normally would.



The following will work in the example scenario of unboxing a decimal:



return (int)(decimal)(ViewState["MetaDataInt"] ?? 0)


I suggest you look at the type of ViewState["MetaDataInt"] in the debugger, and alter your cast accordingly.



Edit:



I can see what's going on. In your screenshot, you're attempting to unbox to a long, but your coalesced zero is an int. This is why you're getting an exception.



The following will fix your specific problem.



return (long)(ViewState["ParentID"] ?? 0L)


Note the 0L, this is how you write a long as a numeric literal.



You're having the issue because you're coalescing the 0 int with a null object, so the result of that coalesce is also an object, in this case a boxed int. A boxed int can only be unboxed to an int, but you're attempting to unbox it to a long. We fix this by boxing a 0 long instead, so you can unbox it to a long.






share|improve this answer















If (int)(ViewState["MetaDataInt"] ?? 0) is throwing an InvalidCastException, it must be because your value in the statebag isn't an int.



This is because:




a boxed T can only be unboxed to T (or Nullable.) Once it is
unboxed, it’s just a value that can be cast as usual.




The above quote is taken from Representation and Identity by Eric Lippert, which I recommend you read.



So if you are storing a type that is anything other than int or int? in your "MetaDataInt" statebag entry, you will get an invalid cast exception, even if that value is something that could cast to int.



For example, if it contains a decimal, then you can only unbox it as a decimal. After that, you can cast as you normally would.



The following will work in the example scenario of unboxing a decimal:



return (int)(decimal)(ViewState["MetaDataInt"] ?? 0)


I suggest you look at the type of ViewState["MetaDataInt"] in the debugger, and alter your cast accordingly.



Edit:



I can see what's going on. In your screenshot, you're attempting to unbox to a long, but your coalesced zero is an int. This is why you're getting an exception.



The following will fix your specific problem.



return (long)(ViewState["ParentID"] ?? 0L)


Note the 0L, this is how you write a long as a numeric literal.



You're having the issue because you're coalescing the 0 int with a null object, so the result of that coalesce is also an object, in this case a boxed int. A boxed int can only be unboxed to an int, but you're attempting to unbox it to a long. We fix this by boxing a 0 long instead, so you can unbox it to a long.







share|improve this answer














share|improve this answer



share|improve this answer








edited Nov 14 '18 at 9:06

























answered Nov 13 '18 at 12:07









Doctor JonesDoctor Jones

17.4k116391




17.4k116391












  • @[doctor jones] You're so right, it would be nicer to have a null point exception. But I promise you ;) check my debug, I don't have the key in my collection: dropbox.com/s/pguvim5ky2qdvzg/…

    – stebberg
    Nov 13 '18 at 12:19












  • @stebberg, I have updated my answer based on your feedback

    – Doctor Jones
    Nov 13 '18 at 12:47











  • Here is working example of the behavior dotnetfiddle.net/UPjorI

    – Jodrell
    Nov 13 '18 at 13:02











  • @stebberg Here is an even more applicable version dotnetfiddle.net/sm2SfU

    – Jodrell
    Nov 13 '18 at 13:07












  • hmm... that's so strange! As @DoctorJones says converting the second part to long will do it long l = (long)(ViewState["ParentID"] ?? Convert.ToInt64(0)); or of course as suggested nicer long l = (long)(ViewState["ParentID"] ?? 0L); To be honest I still don't understand why this works, I have to read your answer again and really think this through.. MANY thanks @DoctorJones

    – stebberg
    Nov 14 '18 at 7:30


















  • @[doctor jones] You're so right, it would be nicer to have a null point exception. But I promise you ;) check my debug, I don't have the key in my collection: dropbox.com/s/pguvim5ky2qdvzg/…

    – stebberg
    Nov 13 '18 at 12:19












  • @stebberg, I have updated my answer based on your feedback

    – Doctor Jones
    Nov 13 '18 at 12:47











  • Here is working example of the behavior dotnetfiddle.net/UPjorI

    – Jodrell
    Nov 13 '18 at 13:02











  • @stebberg Here is an even more applicable version dotnetfiddle.net/sm2SfU

    – Jodrell
    Nov 13 '18 at 13:07












  • hmm... that's so strange! As @DoctorJones says converting the second part to long will do it long l = (long)(ViewState["ParentID"] ?? Convert.ToInt64(0)); or of course as suggested nicer long l = (long)(ViewState["ParentID"] ?? 0L); To be honest I still don't understand why this works, I have to read your answer again and really think this through.. MANY thanks @DoctorJones

    – stebberg
    Nov 14 '18 at 7:30

















@[doctor jones] You're so right, it would be nicer to have a null point exception. But I promise you ;) check my debug, I don't have the key in my collection: dropbox.com/s/pguvim5ky2qdvzg/…

– stebberg
Nov 13 '18 at 12:19






@[doctor jones] You're so right, it would be nicer to have a null point exception. But I promise you ;) check my debug, I don't have the key in my collection: dropbox.com/s/pguvim5ky2qdvzg/…

– stebberg
Nov 13 '18 at 12:19














@stebberg, I have updated my answer based on your feedback

– Doctor Jones
Nov 13 '18 at 12:47





@stebberg, I have updated my answer based on your feedback

– Doctor Jones
Nov 13 '18 at 12:47













Here is working example of the behavior dotnetfiddle.net/UPjorI

– Jodrell
Nov 13 '18 at 13:02





Here is working example of the behavior dotnetfiddle.net/UPjorI

– Jodrell
Nov 13 '18 at 13:02













@stebberg Here is an even more applicable version dotnetfiddle.net/sm2SfU

– Jodrell
Nov 13 '18 at 13:07






@stebberg Here is an even more applicable version dotnetfiddle.net/sm2SfU

– Jodrell
Nov 13 '18 at 13:07














hmm... that's so strange! As @DoctorJones says converting the second part to long will do it long l = (long)(ViewState["ParentID"] ?? Convert.ToInt64(0)); or of course as suggested nicer long l = (long)(ViewState["ParentID"] ?? 0L); To be honest I still don't understand why this works, I have to read your answer again and really think this through.. MANY thanks @DoctorJones

– stebberg
Nov 14 '18 at 7:30






hmm... that's so strange! As @DoctorJones says converting the second part to long will do it long l = (long)(ViewState["ParentID"] ?? Convert.ToInt64(0)); or of course as suggested nicer long l = (long)(ViewState["ParentID"] ?? 0L); To be honest I still don't understand why this works, I have to read your answer again and really think this through.. MANY thanks @DoctorJones

– stebberg
Nov 14 '18 at 7:30














2














Use Nullable<int> property instead of normal int to cast with null-coalescing operator:



public int? MetaExtraDataInt

get return (int?)ViewState["MetaDataInt"] ?? 0;
set ViewState["MetaDataInt"] = value;



Based from operator precedence, the null-coalescing is performed after cast to Nullable<int>, so that it returns zero when ViewState["MetaDataInt"] contains null value.






share|improve this answer

























  • thank you Tetsuya, but I need to have this property as int and not int?

    – stebberg
    Nov 13 '18 at 10:07











  • It depends on how you want to use it, I recommends Nullable<int> as return type if you want to contain null values, otherwise int should be enough.

    – Tetsuya Yamamoto
    Nov 13 '18 at 10:08











  • hmm, but I don't want to cast a null to an int, that's why I have the ?? check first and then I do the cast

    – stebberg
    Nov 13 '18 at 10:42











  • I honestly don't think the null-check and the convert is in the wrong order here, Unless the ?? messes up how the logic of parentheses works of course

    – stebberg
    Nov 13 '18 at 11:18











  • Many thanks @Jodrell I actually have no problem to solve the problem, I just want to know why ?? don't work on a statebag

    – stebberg
    Nov 13 '18 at 11:19















2














Use Nullable<int> property instead of normal int to cast with null-coalescing operator:



public int? MetaExtraDataInt

get return (int?)ViewState["MetaDataInt"] ?? 0;
set ViewState["MetaDataInt"] = value;



Based from operator precedence, the null-coalescing is performed after cast to Nullable<int>, so that it returns zero when ViewState["MetaDataInt"] contains null value.






share|improve this answer

























  • thank you Tetsuya, but I need to have this property as int and not int?

    – stebberg
    Nov 13 '18 at 10:07











  • It depends on how you want to use it, I recommends Nullable<int> as return type if you want to contain null values, otherwise int should be enough.

    – Tetsuya Yamamoto
    Nov 13 '18 at 10:08











  • hmm, but I don't want to cast a null to an int, that's why I have the ?? check first and then I do the cast

    – stebberg
    Nov 13 '18 at 10:42











  • I honestly don't think the null-check and the convert is in the wrong order here, Unless the ?? messes up how the logic of parentheses works of course

    – stebberg
    Nov 13 '18 at 11:18











  • Many thanks @Jodrell I actually have no problem to solve the problem, I just want to know why ?? don't work on a statebag

    – stebberg
    Nov 13 '18 at 11:19













2












2








2







Use Nullable<int> property instead of normal int to cast with null-coalescing operator:



public int? MetaExtraDataInt

get return (int?)ViewState["MetaDataInt"] ?? 0;
set ViewState["MetaDataInt"] = value;



Based from operator precedence, the null-coalescing is performed after cast to Nullable<int>, so that it returns zero when ViewState["MetaDataInt"] contains null value.






share|improve this answer















Use Nullable<int> property instead of normal int to cast with null-coalescing operator:



public int? MetaExtraDataInt

get return (int?)ViewState["MetaDataInt"] ?? 0;
set ViewState["MetaDataInt"] = value;



Based from operator precedence, the null-coalescing is performed after cast to Nullable<int>, so that it returns zero when ViewState["MetaDataInt"] contains null value.







share|improve this answer














share|improve this answer



share|improve this answer








edited Nov 13 '18 at 10:04

























answered Nov 13 '18 at 9:55









Tetsuya YamamotoTetsuya Yamamoto

15k42040




15k42040












  • thank you Tetsuya, but I need to have this property as int and not int?

    – stebberg
    Nov 13 '18 at 10:07











  • It depends on how you want to use it, I recommends Nullable<int> as return type if you want to contain null values, otherwise int should be enough.

    – Tetsuya Yamamoto
    Nov 13 '18 at 10:08











  • hmm, but I don't want to cast a null to an int, that's why I have the ?? check first and then I do the cast

    – stebberg
    Nov 13 '18 at 10:42











  • I honestly don't think the null-check and the convert is in the wrong order here, Unless the ?? messes up how the logic of parentheses works of course

    – stebberg
    Nov 13 '18 at 11:18











  • Many thanks @Jodrell I actually have no problem to solve the problem, I just want to know why ?? don't work on a statebag

    – stebberg
    Nov 13 '18 at 11:19

















  • thank you Tetsuya, but I need to have this property as int and not int?

    – stebberg
    Nov 13 '18 at 10:07











  • It depends on how you want to use it, I recommends Nullable<int> as return type if you want to contain null values, otherwise int should be enough.

    – Tetsuya Yamamoto
    Nov 13 '18 at 10:08











  • hmm, but I don't want to cast a null to an int, that's why I have the ?? check first and then I do the cast

    – stebberg
    Nov 13 '18 at 10:42











  • I honestly don't think the null-check and the convert is in the wrong order here, Unless the ?? messes up how the logic of parentheses works of course

    – stebberg
    Nov 13 '18 at 11:18











  • Many thanks @Jodrell I actually have no problem to solve the problem, I just want to know why ?? don't work on a statebag

    – stebberg
    Nov 13 '18 at 11:19
















thank you Tetsuya, but I need to have this property as int and not int?

– stebberg
Nov 13 '18 at 10:07





thank you Tetsuya, but I need to have this property as int and not int?

– stebberg
Nov 13 '18 at 10:07













It depends on how you want to use it, I recommends Nullable<int> as return type if you want to contain null values, otherwise int should be enough.

– Tetsuya Yamamoto
Nov 13 '18 at 10:08





It depends on how you want to use it, I recommends Nullable<int> as return type if you want to contain null values, otherwise int should be enough.

– Tetsuya Yamamoto
Nov 13 '18 at 10:08













hmm, but I don't want to cast a null to an int, that's why I have the ?? check first and then I do the cast

– stebberg
Nov 13 '18 at 10:42





hmm, but I don't want to cast a null to an int, that's why I have the ?? check first and then I do the cast

– stebberg
Nov 13 '18 at 10:42













I honestly don't think the null-check and the convert is in the wrong order here, Unless the ?? messes up how the logic of parentheses works of course

– stebberg
Nov 13 '18 at 11:18





I honestly don't think the null-check and the convert is in the wrong order here, Unless the ?? messes up how the logic of parentheses works of course

– stebberg
Nov 13 '18 at 11:18













Many thanks @Jodrell I actually have no problem to solve the problem, I just want to know why ?? don't work on a statebag

– stebberg
Nov 13 '18 at 11:19





Many thanks @Jodrell I actually have no problem to solve the problem, I just want to know why ?? don't work on a statebag

– stebberg
Nov 13 '18 at 11:19











-2














Does it work when ViewBag contains the key? Try to cast the viewstate return like:



get return (int)(ViewState["MetaDataInt"]) ?? 0); 





share|improve this answer























  • (int)(ViewState["MetaDataInt"]) never returns null, because when ViewState["MetaDataInt"] returns null, a InvalidOpertationException is thrown when casting to int.

    – HimBromBeere
    Nov 13 '18 at 10:04











  • Yes it works great when ViewBag contains the value.

    – stebberg
    Nov 13 '18 at 10:08















-2














Does it work when ViewBag contains the key? Try to cast the viewstate return like:



get return (int)(ViewState["MetaDataInt"]) ?? 0); 





share|improve this answer























  • (int)(ViewState["MetaDataInt"]) never returns null, because when ViewState["MetaDataInt"] returns null, a InvalidOpertationException is thrown when casting to int.

    – HimBromBeere
    Nov 13 '18 at 10:04











  • Yes it works great when ViewBag contains the value.

    – stebberg
    Nov 13 '18 at 10:08













-2












-2








-2







Does it work when ViewBag contains the key? Try to cast the viewstate return like:



get return (int)(ViewState["MetaDataInt"]) ?? 0); 





share|improve this answer













Does it work when ViewBag contains the key? Try to cast the viewstate return like:



get return (int)(ViewState["MetaDataInt"]) ?? 0); 






share|improve this answer












share|improve this answer



share|improve this answer










answered Nov 13 '18 at 9:58









Mr. XMr. X

437




437












  • (int)(ViewState["MetaDataInt"]) never returns null, because when ViewState["MetaDataInt"] returns null, a InvalidOpertationException is thrown when casting to int.

    – HimBromBeere
    Nov 13 '18 at 10:04











  • Yes it works great when ViewBag contains the value.

    – stebberg
    Nov 13 '18 at 10:08

















  • (int)(ViewState["MetaDataInt"]) never returns null, because when ViewState["MetaDataInt"] returns null, a InvalidOpertationException is thrown when casting to int.

    – HimBromBeere
    Nov 13 '18 at 10:04











  • Yes it works great when ViewBag contains the value.

    – stebberg
    Nov 13 '18 at 10:08
















(int)(ViewState["MetaDataInt"]) never returns null, because when ViewState["MetaDataInt"] returns null, a InvalidOpertationException is thrown when casting to int.

– HimBromBeere
Nov 13 '18 at 10:04





(int)(ViewState["MetaDataInt"]) never returns null, because when ViewState["MetaDataInt"] returns null, a InvalidOpertationException is thrown when casting to int.

– HimBromBeere
Nov 13 '18 at 10:04













Yes it works great when ViewBag contains the value.

– stebberg
Nov 13 '18 at 10:08





Yes it works great when ViewBag contains the value.

– stebberg
Nov 13 '18 at 10:08

















draft saved

draft discarded
















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid


  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53278234%2fdoes-nullcheck-really-work-on-a-statebag%23new-answer', 'question_page');

);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







這個網誌中的熱門文章

How to read a connectionString WITH PROVIDER in .NET Core?

In R, how to develop a multiplot heatmap.2 figure showing key labels successfully

Museum of Modern and Contemporary Art of Trento and Rovereto