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