Consider the following statements:
int? v1 = null;
int? v2 = 5 * v1;
What is the value of v2
? (null
or empty string?)
How can I prevent the compiler to mark it as invalid operation? Do I need to follow custom exception handling?
Consider the following statements:
int? v1 = null;
int? v2 = 5 * v1;
What is the value of v2
? (null
or empty string?)
How can I prevent the compiler to mark it as invalid operation? Do I need to follow custom exception handling?
It's null
.
C# Language Specification 3.0 (Section §7.2.7: Lifted operators)
For the binary operators
+
-
*
/
%
&
|
^
<<
>>
:a lifted form of an operator exists if the operand and result types are all non-nullable value types. The lifted form is constructed by adding a single
?
modifier to each operand and result type. The lifted operator produces anull
value if one or both operands arenull
(an exception being the&
and|
operators of thebool?
type, as described in §7.10.3). Otherwise, the lifted operator unwraps the operands, applies the underlying operator, and wraps the result.
How can I prevent the compiler to mark it as invalid operation? Do I need to follow custom exception handling?
It's not an invalid operation. It won't throw an exception so you don't need to handle exceptions in this case.
If you want the operation to be prevented by the compiler, make the second variable non-nullable. Then you will be forced to write:
int v2 = 5 * v1.Value;
This will throw an exception at run time if v1 is null.
Its value will be "null", in this context at least can be considered to be the same as a database null, i.e. rather than Nothing, or Zero, it means "Unknown". Five lots of Unknown is still Unknown, it'll also never be "empty string" as you're dealing with numbers, not strings.
I'm not sure what you mean by "How can I prevent the compiler to mark it as invalid operation?" as this code compiles and runs fine for me under Visual Studio 2008 =)
I'm not sure what you are trying to do, but if you want v2 to be null if v1 is null then you should test if v1 has a value prior to using it.
int? v2 = v1.HasValue ? 5 * v1.Value : null;
or
int? v2 = null;
if (v1.HasValue) { v2 = 5 * v1.Value; }
© 2022 - 2024 — McMap. All rights reserved.
v2
value somehow, and then it may become apparent thatv2.ToString() == ""
. TheNullable<>
type overridesToString
and outputs""
ifHasValue
is false. Note: This is relevant only ifToString
is called directly, without boxingv2
first (for exampleIFormattable box = v2
will give anull
reference, not a box; sobox.ToString("D4", CultureInfo.InvariantCulture)
will fail, trying to follow anull
reference). – MiddlingNullable
and it's edge cases withToString
- I didn't know that, thanks! – Grit