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!

Comments

blog comments powered by Disqus
Next Post
Listening time  12 Feb 2009
Prior Post
Be A Better Developer  10 Feb 2009
Related Posts
Caching without Race Conditions  13 Jun 2020
Improved Caching  09 May 2020
Caching Speech  25 Apr 2020
Speech Middleware  11 Apr 2020
Redux Middleware Implementation  28 Mar 2020
Redux Middleware  14 Mar 2020
Always review code you copy  29 Feb 2020
Speech API  15 Feb 2020
Logging Implementation  25 Jan 2020
Logging Demonstrated  11 Jan 2020
More csharp posts »
Archives
February 2009
2009