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
Dependency Injection: Views  17 Aug 2019
Dependency Injection: ViewModels  10 Aug 2019
Dependency Injection: Core  27 Jul 2019
Integration Testing  20 Jul 2019
Restructuring Reducers  13 Jul 2019
Vocabulary Browser  29 Jun 2019
Revisiting ViewModelBase  15 Jun 2019
First Light  08 Jun 2019
Add Word View  25 May 2019
Add Word View Model  11 May 2019
More csharp posts »
Archives
February 2009
2009