Welcome to the Treehouse Community

Want to collaborate on code errors? Have bugs you need feedback on? Looking for an extra set of eyes on your latest project? Get support with fellow developers, designers, and programmers of all backgrounds and skill levels here with the Treehouse Community! While you're at it, check out some resources Treehouse students have shared here.

Looking to learn something new?

Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and join thousands of Treehouse students and alumni in the community today.

Start your free trial

C# C# Objects Methods Return Values

Kari Soto
Kari Soto
1,836 Points

Field 'TreehouseDefense.Point.X' is never assigned to, and will always have its default value '0'

When I use the Console.WriteLine(isOnMap);, both results are true.

Game.cs:

using System;

namespace TreehouseDefense { class Game { public static void Main() { Map map = new Map(8, 5); Point point = new Point(4, 2);

      bool isOnMap = map.OnMap(point);

      Console.WriteLine(isOnMap);
      point = new Point(10, 5);
      isOnMap = map.OnMap(point);
      Console.WriteLine(isOnMap);


    }
}

}

Map.cs:

namespace TreehouseDefense { class Map { public readonly int Width; public readonly int Height;

public Map(int width, int height)
{
  Width = width;
  Height = height;
}

public bool OnMap(Point point)
{
  return point.X >= 0 && point.X < Width && 
    point.Y >=0 && point.Y < Height;
}

} }

Point.cs:

namespace TreehouseDefense { class Point { public readonly int X; public readonly int Y;

public Point(int x, int y) {
  x = X;
  y = Y;
}

} }

I wanted to solve it myself but even after watching the last few videos multiple times, I still have no idea what is the purpose of constructs or how they work.

2 Answers

Steven Parker
Steven Parker
231,198 Points

:point_right: Your constructor for the Point class has the initializations reversed.

In your constructor:

        public Point(int x, int y) {
            x = X;
            y = Y;
        }

The idea is to use the passed-in arguments (lower case) to assign your internal class variables (UPPER case). But as it is, the assignments are reversed so that every point object location will always be 0,0 (which is on the map). This is what the warning message was trying to tell you, at least about "X" (but "Y" has the same issue).

Turn the assignments around so the internal variables get initialized correctly:

        public Point(int x, int y) {
            X = x;  // put the value from the argument into the readonly variable.
            Y = y;
        }
Kari Soto
Kari Soto
1,836 Points

Thank you. Hopefully by the time I finish C# courses, I can be able to find and solve these problems myself.

Glad I'm not the only one who made this mistake! :)