Over on StackOverflow, saw an interesting question that taught me something new about C# 3.0.

The question Automatic Properties and Structures Don’t Mix? asked why this code doesn’t work:

struct MyStruct
    public MyStruct ( int size )
        this.Size = size; // <-- Compile-Time Error!

    public int Size{get; set;}

Turns out that the solution is to properly chain the declared constructor with the default parameterless constructor:

struct MyStruct
    public MyStruct(int size)
        : this()   // Add this for the fix
        this.Size = size; // <-- Compile-Time Error!

    public int Size { get; set; }

Which just goes to show that taking shortcuts (like not properly chaining constructors) can turn around and bite.

Interestingly, though, the C# compiler gives you all the information you need to solve this as a part of the error messages (emphasis added):

  • error CS0188: The ‘this’ object cannot be used before all of its fields are assigned to

  • error CS0843: Backing field for automatically implemented property ‘WindowsApplicationSample.MyStruct.Size’ must be fully assigned before control is returned to the caller. Consider calling the default constructor from a constructor initializer.

Someone posted another solution, taken from a Codeplex project - though in this case I think the “solution” is a problem in it’s own right … check it out.

public struct TempTuple<TFirst, TSecond>
    public TempTuple(TFirst first, TSecond second)
        this = new TempTuple<TFirst, TSecond>(); // Kung fu!
        this.First = first;
        this.Second = second;

    public TFirst First { get; private set; }

    public TSecond Second { get; private set; }

Look at the “Kung fu!” like - assignment to this - Yikes!


blog comments powered by Disqus
Next Post
Listening time  12 Feb 2009
Prior Post
Be A Better Developer  10 Feb 2009
Related Posts
When (not) to use Var  16 Jul 2016
Semantic Types Redux  05 Jun 2016
Semantic Types in C#6  27 May 2016
Property Enhancements for C#  20 Dec 2015
Language Extensions for C#  19 May 2014
When should methods be Static?  09 Oct 2012
Of Method Naming and more  29 Sep 2012
Someone needs an intervention  16 Dec 2011
CallerInfo in C# 5  08 Dec 2011
Regions in C#  16 May 2011
More csharp posts »
Related Pages
February 2009 archive