5

Is there a not null coalescing operator in C# which in case could be used such as:

public void Foo(string arg1) { Bar b = arg1 !?? Bar.Parse(arg1); } 

The following case made me think of it:

public void SomeMethod(string strStartDate) { DateTime? dtStartDate = strStartDate !?? DateTime.ParseExact(strStartDate, "dd.MM.yyyy", System.Globalization.CultureInfo.InvariantCulture); } 

I might not have strStartDate information, which in case will be null but if i do; i'm always certain that it will be in expected format. So instead of initializing dtStartDate = null and trying to parse and set the value within try catch block. It seems to be more useful.

I suppose the answer is no (and there is no such operator !?? or anything else) I wonder if there's a way to implement this logic, would it be worth and what would be the cases that it comes useful.

8

2 Answers 2

6

Mads Torgersen has publicly said that a null-propagating operator is under consideration for the next version of C# (but also emphasised that this doesn't mean it will be there). This would allow code like:

var value = someValue?.Method()?.AnotherMethod(); 

where the ?. returns null if the operand (on the left) is null, else will evaluate the right hand side. I suspect that would get you a lot of the way here, especially if combined with (say) extension methods; for example:

DateTime? dtStartDate = strStartDate?.MyParse(); 

where:

static DateTime MyParse(this string value) { return DateTime.ParseExact(value, "dd.MM.yyyy", System.Globalization.CultureInfo.InvariantCulture ); 

However! You could do the same thing right now just using extension methods:

DateTime? dtStartDate = strStartDate.MyParse(); static DateTime? MyParse(this string value) { if(value == null) return null; return DateTime.ParseExact(value, "dd.MM.yyyy", System.Globalization.CultureInfo.InvariantCulture ); 
Sign up to request clarification or add additional context in comments.

2 Comments

That is the answer, thank you. I considered your right now suggestion as alternative for using conditional operator
Do you know if any consideration was given to, instead of only having an operator that maps null to null, having foo ?.bar : baz be equivalent [but for foo being evaluated only once] to foo ? foo.bar : baz? That would I think both make the syntax more useful and also bring it closer to ? :.
2

Just use the ternary conditional operator ?::

DateTime? dtStartDate = strStartDate == null ? null : DateTime.ParseExact(…) 

An operator you proposed isn’t actually easily doable because it has a non-consistent type:

DateTime? a = (string)b !?? (DateTime)c; 

For this expression to work, the compiler would need to know at compile time that b is null, so that the (null) string value can be assigned to a.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.