Struct Weirdness
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!
Recent comments
3 weeks 4 days ago
4 weeks 3 days ago
4 weeks 3 days ago
4 weeks 4 days ago
7 weeks 16 hours ago
7 weeks 3 days ago
7 weeks 3 days ago
10 weeks 1 day ago
11 weeks 3 days ago
11 weeks 4 days ago