System.Nullable<T> What is the value of null * int value?
Asked Answered
C

4

5

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?

Caulis answered 25/8, 2009 at 12:19 Comment(3)
How can that be an empty string?Grit
@Grit It certainly cannot. Maybe the asker was writing out the v2 value somehow, and then it may become apparent that v2.ToString() == "". The Nullable<> type overrides ToString and outputs "" if HasValue is false. Note: This is relevant only if ToString is called directly, without boxing v2 first (for example IFormattable box = v2 will give a null reference, not a box; so box.ToString("D4", CultureInfo.InvariantCulture) will fail, trying to follow a null reference).Middling
@Jeppe - Good point about Nullable and it's edge cases with ToString - I didn't know that, thanks!Grit
E
20

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 a null value if one or both operands are null (an exception being the & and | operators of the bool? 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.

Esp answered 25/8, 2009 at 12:20 Comment(1)
Thanks Mehrdad for detailed expln.Caulis
A
11

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.

Andreas answered 25/8, 2009 at 12:22 Comment(0)
R
1

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 =)

Robins answered 25/8, 2009 at 12:23 Comment(0)
S
1

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; }
Silkweed answered 25/8, 2009 at 12:27 Comment(2)
This is not true. You can simply multiply and achieve the same results.Esp
Yes, you are correct and I don't think I said otherwise. I was just indicating that you can and normally should test if the nullable value has a value before using said value.Silkweed

© 2022 - 2024 — McMap. All rights reserved.