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
Equality has Symmetry  17 Mar 2018
Type Miscellany  05 Mar 2017
Testing Immutable Types  25 Feb 2017
Factory Methods  18 Feb 2017
Queue Concatenation  11 Feb 2017
Complex Queues  04 Feb 2017
The Problem with the Simple Queue  28 Jan 2017
Enumeration of Queues  21 Jan 2017
Reversing Stacks  14 Jan 2017
Simple Queues  07 Jan 2017
More csharp posts »
Archives
February 2009
2009