this post was submitted on 26 Jun 2023
9 points (100.0% liked)

C Sharp

1537 readers
1 users here now

A community about the C# programming language

Getting started

Useful resources

IDEs and code editors

Tools

Rules

Related communities

founded 2 years ago
MODERATORS
 

With regards to null conditional operators, calling properties and methods will work fine, e.g.:

HttpContext.Current?.Response.Clear();

But I'm wondering if assignment is possible? I get this error when trying to do this:

HttpContext.Current?.Response.ContentType = "text/json";

The docs say:

The null-conditional operators are short-circuiting. That is, if one operation in a chain of conditional member or element access operations returns null, the rest of the chain doesn't execute.

So wondering if it's possible and I'm doing it wrong, or am I taking "does not execute" too literally? :)

top 9 comments
sorted by: hot top controversial new old
[–] TwilightKiddy 5 points 2 years ago* (last edited 2 years ago) (1 children)

a chain of member or element access

Assignment is not member access nor element access, hence not part of the chain.

[–] slardiaardvark 1 points 2 years ago

Bummer, thought that might be the case, but was wishing it wasn't because it seemed quite nice to avoid the ifs there as well.

[–] [email protected] 3 points 2 years ago

It's not currently possible because the null conditional operator returns a value not a variable. Looks like there was some discussion on stack overflow and a GitHub issue was created a while ago but it hasn't had much activity recently.

[–] kogasa 3 points 2 years ago (2 children)

What is the precise expected behavior here? If HttpContext.Current?.Response.ContentType is not null, then assign it to "text/json", otherwise explode? I would intuitively evaluate the latter case as trying to assign null = "text/json" which doesn't make sense to me.

[–] [email protected] 1 points 2 years ago (1 children)

I can see how you could think of the setter like Current?.Response.set_ContentType("text/json") and then if Current is null you just skip the assignment like you would any other method call.

[–] kogasa 1 points 2 years ago

Yeah, for properties but not instance fields.

[–] slardiaardvark 1 points 2 years ago (1 children)

What is the precise expected behavior here?

Oh just because the docs said "The null-conditional operators are short-circuiting" and "the rest of the chain doesn’t execute" I wondered, if the object is null, it would just skip executing the assignment completely. Didn't have high hopes, but thought I'd ask just in case, as it would be kinda handy as well. Probably pretty rarely though.

[–] Lmaydev 1 points 1 year ago* (last edited 1 year ago)

What it does essentially is a null check and jump after each member.

So what you would end up with is null = ... As the result of the expression (chain) is what is being assigned to. The assignment is an expression its self that takes two expressions. One to be assigned to and the value to assign.

Which obviously is always going to be an error.

[–] atheken 1 points 1 year ago

When there is ambiguity in the behavior of something like this, it’s usually easier to just construct a unit test and see what happens.

Make a class with some deeply nested members and then do an assignment.

See what happens.