[{"data":1,"prerenderedAt":272},["ShallowReactive",2],{"blog:2006:handlingnullablevaluetypesindotnet":3,"blogMore-Development":258,"comments-handlingnullablevaluetypesindotnet":271},{"id":4,"title":5,"body":6,"category":240,"commentCount":241,"date":242,"description":12,"excerpt":243,"extension":244,"filenames":245,"hidden":246,"image":245,"meta":247,"minutes":52,"navigation":248,"path":249,"seo":250,"showCategory":245,"stem":251,"tags":252,"updated":245,"url":255,"wordCount":256,"__hash__":257},"content\u002Fblog\u002F2006\u002Fhandlingnullablevaluetypesindotnet.md","Handling nullable value types in .NET 1.x",{"type":7,"value":8,"toc":238},"minimark",[9,13,16,76,79,155,162,173,225,228,234],[10,11,12],"p",{},"One of the great new features in .NET 2.0 is support for nullable types, especially important when dealing with value types such as Int or DateTime values coming from a database. Previously you were forced to either set and track another binary flag or to use a “special” value to represent null that sooner or later would turn up in real data.",[10,14,15],{},"In C# 2.0 thanks to a bit of syntactic sugar we can do this;",[17,18,23],"pre",{"className":19,"code":20,"language":21,"meta":22,"style":22},"language-csharp shiki shiki-themes everforest-light dracula","int? nullable1 = 1;\nif (nullable1 == null) nullable1 = 2;\n","csharp","",[24,25,26,50],"code",{"__ignoreMap":22},[27,28,31,35,39,43,47],"span",{"class":29,"line":30},"line",1,[27,32,34],{"class":33},"sXAHl","int",[27,36,38],{"class":37},"s6Vpi","? nullable1 ",[27,40,42],{"class":41},"s9HRq","=",[27,44,46],{"class":45},"s3Ipq"," 1",[27,48,49],{"class":37},";\n",[27,51,53,57,60,63,66,69,71,74],{"class":29,"line":52},2,[27,54,56],{"class":55},"smiwp","if",[27,58,59],{"class":37}," (nullable1 ",[27,61,62],{"class":41},"==",[27,64,65],{"class":45}," null",[27,67,68],{"class":37},") nullable1 ",[27,70,42],{"class":41},[27,72,73],{"class":45}," 2",[27,75,49],{"class":37},[10,77,78],{},"Which the C# compiler actually turns into the following:",[17,80,82],{"className":19,"code":81,"language":21,"meta":22,"style":22},"Nullable\u003Cint> nullable1 = new Nullable\u003Cint>(1);\nif (!nullable1.HasValue) nullable1 = new Nullable\u003Cint>(2);\n",[24,83,84,119],{"__ignoreMap":22},[27,85,86,90,93,95,98,100,103,106,108,110,113,116],{"class":29,"line":30},[27,87,89],{"class":88},"snuxY","Nullable",[27,91,92],{"class":37},"\u003C",[27,94,34],{"class":33},[27,96,97],{"class":37},"> nullable1 ",[27,99,42],{"class":41},[27,101,102],{"class":55}," new",[27,104,105],{"class":88}," Nullable",[27,107,92],{"class":37},[27,109,34],{"class":33},[27,111,112],{"class":37},">(",[27,114,115],{"class":45},"1",[27,117,118],{"class":37},");\n",[27,120,121,123,126,129,132,136,138,140,142,144,146,148,150,153],{"class":29,"line":52},[27,122,56],{"class":55},[27,124,125],{"class":37}," (",[27,127,128],{"class":41},"!",[27,130,131],{"class":37},"nullable1.",[27,133,135],{"class":134},"sSKRk","HasValue",[27,137,68],{"class":37},[27,139,42],{"class":41},[27,141,102],{"class":55},[27,143,105],{"class":88},[27,145,92],{"class":37},[27,147,34],{"class":33},[27,149,112],{"class":37},[27,151,152],{"class":45},"2",[27,154,118],{"class":37},[10,156,157,158,161],{},"This makes use of the new ",[24,159,160],{},"Nullable\u003CT>"," generic structure to wrap the value with an additional boolean HasValue property.",[10,163,164,165,172],{},"That looks surprisingly similar to the syntax of the open-source ",[166,167,171],"a",{"href":168,"rel":169},"https:\u002F\u002Fnullabletypes.sourceforge.net",[170],"nofollow","NullableTypes"," project you can use with .NET 1.1 (or 2.0):",[17,174,176],{"className":19,"code":175,"language":21,"meta":22,"style":22},"NullableInt32 nullable1 = new NullableInt32(1);\nif (nullable1.IsNull) nullable1 = new NullableInt(2);\n",[24,177,178,200],{"__ignoreMap":22},[27,179,180,183,186,188,190,193,196,198],{"class":29,"line":30},[27,181,182],{"class":88},"NullableInt32",[27,184,185],{"class":37}," nullable1 ",[27,187,42],{"class":41},[27,189,102],{"class":55},[27,191,192],{"class":88}," NullableInt32",[27,194,195],{"class":37},"(",[27,197,115],{"class":45},[27,199,118],{"class":37},[27,201,202,204,207,210,212,214,216,219,221,223],{"class":29,"line":52},[27,203,56],{"class":55},[27,205,206],{"class":37}," (nullable1.",[27,208,209],{"class":134},"IsNull",[27,211,68],{"class":37},[27,213,42],{"class":41},[27,215,102],{"class":55},[27,217,218],{"class":88}," NullableInt",[27,220,195],{"class":37},[27,222,152],{"class":45},[27,224,118],{"class":37},[10,226,227],{},"Disclaimer: I’ve worked on the NullableTypes project specifically implementing the IXmlSerializable, NullableGuid & NullableTimeSpan.",[10,229,230],{},[231,232,233],"em",{},"[)amien",[235,236,237],"style",{},"html pre.shiki code .sXAHl, html code.shiki .sXAHl{--shiki-default:#3A94C5;--shiki-dark:#FF79C6}html pre.shiki code .s6Vpi, html code.shiki .s6Vpi{--shiki-default:#5C6A72;--shiki-dark:#F8F8F2}html pre.shiki code .s9HRq, html code.shiki .s9HRq{--shiki-default:#F57D26;--shiki-dark:#FF79C6}html pre.shiki code .s3Ipq, html code.shiki .s3Ipq{--shiki-default:#DF69BA;--shiki-dark:#BD93F9}html pre.shiki code .smiwp, html code.shiki .smiwp{--shiki-default:#F85552;--shiki-dark:#FF79C6}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .snuxY, html code.shiki .snuxY{--shiki-default:#3A94C5;--shiki-default-font-style:inherit;--shiki-dark:#8BE9FD;--shiki-dark-font-style:italic}html pre.shiki code .sSKRk, html code.shiki .sSKRk{--shiki-default:#35A77C;--shiki-dark:#F8F8F2}",{"title":22,"searchDepth":52,"depth":52,"links":239},[],"Development",0,"2006-04-20T01:53:00+00:00","[object Object]","md",null,false,{},true,"\u002Fblog\u002F2006\u002Fhandlingnullablevaluetypesindotnet",{"title":5,"description":12},"blog\u002F2006\u002Fhandlingnullablevaluetypesindotnet",[253,254],".NET","C#","\u002Fblog\u002F2006\u002Fhandlingnullablevaluetypesindotnet\u002F",278,"CrNG1bTb0leEHnK7746cRc0YYuYZj8ufueKJuKmqz4c",[259,263,267],{"title":260,"date":261,"url":262},"Transactions in the MongoDB EF Core Provider","2025-10-25","\u002Fblog\u002F2025\u002Fmongodb-explicit-transactions\u002F",{"title":264,"date":265,"url":266},"Queryable Encryption with the MongoDB EF Core Provider","2025-09-22","\u002Fblog\u002F2025\u002Fmongodb-queryable-encryption\u002F",{"title":268,"date":269,"url":270},"Lazy Loading with EF Core Proxies","2025-04-02","\u002Fblog\u002F2025\u002Fef-proxies\u002F",[],1780900533508]