Challengewhat does this code print?
Given the following code:
Can you guess what it will do?
Can you explain why?
I love that this snippet is under 20 lines of code, but being able to explain it shows a lot more knowledge about C# than you would expect.
More posts in "Challenge" series:
- (03 Feb 2025) Giving file system developer ulcer
 - (20 Jan 2025) What does this code do?
 - (01 Jul 2024) Efficient snapshotable state
 - (13 Oct 2023) Fastest node selection metastable error state–answer
 - (12 Oct 2023) Fastest node selection metastable error state
 - (19 Sep 2023) Spot the bug
 - (04 Jan 2023) what does this code print?
 - (14 Dec 2022) What does this code print?
 - (01 Jul 2022) Find the stack smash bug… – answer
 - (30 Jun 2022) Find the stack smash bug…
 - (03 Jun 2022) Spot the data corruption
 - (06 May 2022) Spot the optimization–solution
 - (05 May 2022) Spot the optimization
 - (06 Apr 2022) Why is this code broken?
 - (16 Dec 2021) Find the slow down–answer
 - (15 Dec 2021) Find the slow down
 - (03 Nov 2021) The code review bug that gives me nightmares–The fix
 - (02 Nov 2021) The code review bug that gives me nightmares–the issue
 - (01 Nov 2021) The code review bug that gives me nightmares
 - (16 Jun 2021) Detecting livelihood in a distributed cluster
 - (21 Apr 2020) Generate matching shard id–answer
 - (20 Apr 2020) Generate matching shard id
 - (02 Jan 2020) Spot the bug in the stream
 - (28 Sep 2018) The loop that leaks–Answer
 - (27 Sep 2018) The loop that leaks
 - (03 Apr 2018) The invisible concurrency bug–Answer
 - (02 Apr 2018) The invisible concurrency bug
 - (31 Jan 2018) Find the bug in the fix–answer
 - (30 Jan 2018) Find the bug in the fix
 - (19 Jan 2017) What does this code do?
 - (26 Jul 2016) The race condition in the TCP stack, answer
 - (25 Jul 2016) The race condition in the TCP stack
 - (28 Apr 2015) What is the meaning of this change?
 - (26 Sep 2013) Spot the bug
 - (27 May 2013) The problem of locking down tasks…
 - (17 Oct 2011) Minimum number of round trips
 - (23 Aug 2011) Recent Comments with Future Posts
 - (02 Aug 2011) Modifying execution approaches
 - (29 Apr 2011) Stop the leaks
 - (23 Dec 2010) This code should never hit production
 - (17 Dec 2010) Your own ThreadLocal
 - (03 Dec 2010) Querying relative information with RavenDB
 - (29 Jun 2010) Find the bug
 - (23 Jun 2010) Dynamically dynamic
 - (28 Apr 2010) What killed the application?
 - (19 Mar 2010) What does this code do?
 - (04 Mar 2010) Robust enumeration over external code
 - (16 Feb 2010) Premature optimization, and all of that…
 - (12 Feb 2010) Efficient querying
 - (10 Feb 2010) Find the resource leak
 - (21 Oct 2009) Can you spot the bug?
 - (18 Oct 2009) Why is this wrong?
 - (17 Oct 2009) Write the check in comment
 - (15 Sep 2009) NH Prof Exporting Reports
 - (02 Sep 2009) The lazy loaded inheritance many to one association OR/M conundrum
 - (01 Sep 2009) Why isn’t select broken?
 - (06 Aug 2009) Find the bug fixes
 - (26 May 2009) Find the bug
 - (14 May 2009) multi threaded test failure
 - (11 May 2009) The regex that doesn’t match
 - (24 Mar 2009) probability based selection
 - (13 Mar 2009) C# Rewriting
 - (18 Feb 2009) write a self extracting program
 - (04 Sep 2008) Don't stop with the first DSL abstraction
 - (02 Aug 2008) What is the problem?
 - (28 Jul 2008) What does this code do?
 - (26 Jul 2008) Find the bug fix
 - (05 Jul 2008) Find the deadlock
 - (03 Jul 2008) Find the bug
 - (02 Jul 2008) What is wrong with this code
 - (05 Jun 2008) why did the tests fail?
 - (27 May 2008) Striving for better syntax
 - (13 Apr 2008) calling generics without the generic type
 - (12 Apr 2008) The directory tree
 - (24 Mar 2008) Find the version
 - (21 Jan 2008) Strongly typing weakly typed code
 - (28 Jun 2007) Windsor Null Object Dependency Facility
 

Comments
Iterator is a struct so when you access the
Valueproperty it will copy the value onto the stack and use it locally, so when you callit.Value.MoveNext()the method call is going to a new copy. Same is true when you callit.Value.Current... you are dealing with a new instance again. Code will loop forever printing0. Since the copy happens on read, it doesn't even matter that you are usingNullable<Iterator>here (also a struct), the same behavior happens even if you had a reference type boxing the value and passed that around.I should clarify that using
Nullable<Iterator>(akaIterator?) is how you force the copy-by-value behavior here because you no longer are pointing directly to the value on the stack, you'll always be getting a copy.It prints 0 forever. Every time you call
it.Value, you get a new copy of the struct, so the struct actually contained in the nullable never changes.It will give you infinite stream of zeros. Is there a reason why one might need to use Nullable<Iterator> here ? I mean - it's clear that it will always give you a copy of value thus being a culprit of this "unusual" behaviour. But why one might want to try it ?
Comment preview