Can anybody pinpoint the cause of this StackOverflowException?
<p>Trying to learn to program and once again losing all confidence because I think I've internalised a simple concept but something seemingly extraordinary is happening or it is just flying right over my head.</p>

<p>When I run the program I get a StackOverFlowException if I access the property by assigning a string to FirstName or SecondName</p>

<p>My Customer Class:</p>

<pre><code>class Customer : ICustomer
{
    public string FirstName
    {
        get
        {
            return FirstName;
        }

        set
        {
            FirstName = value;
        }
    }

    public string fName
    {
        get
        {
            return fName;
        }

        set
        {
            fName = value;
        }
    }

    public string SecondName
    {
        get
        {
            return SecondName;
        }

        set
        {
            SecondName = value;
        }
    }

    public string sName
    {
        get
        {
            return sName;
        }

        set
        {
            sName = value;
        }
    }

    public int ID
    {
        get
        {
            return ID;
        }

        set
        {
            ID = value;
        }
    }

    public int mId
    {
        get
        {
            return mId;
        }

        set
        {
            mId = value;
        }
    }

    public int GetID()
    {
        return mId;
    }

    public void SetID(int id)
    {
        mId = ID;
    }

    public void SetName(string fName, string sName)
    {
        fName = FirstName;
        sName = SecondName;
    }
}
</code></pre>

<p>and the main program</p>

<pre><code>class Program
{
    /// &lt;summary&gt;
    /// Create unique string code based off current date and time.
    /// &lt;/summary&gt;
    /// &lt;returns&gt;code string&lt;/returns&gt;
    static string generateUniqueCode()
    {
        string characters = "abcdefghijklmnopqrstuvqxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        string ticks = DateTime.UtcNow.Ticks.ToString();
        var code = "";
        for (var i = 0; i &lt; characters.Length; i += 2)
        {
            if ((i + 2) &lt;= ticks.Length)
            {
                var number = int.Parse(ticks.Substring(i, 2));
                if (number &gt; characters.Length - 1)
                {
                    var one = double.Parse(number.ToString().Substring(0, 1));
                    var two = double.Parse(number.ToString().Substring(1, 1));
                    code += characters[Convert.ToInt32(one)];
                    code += characters[Convert.ToInt32(two)];
                }
                else
                    code += characters[number];
            }
        }
        return code;
    }

    /// &lt;summary&gt;
    /// Creates unique integer code based off current date and time.
    /// &lt;/summary&gt;
    /// &lt;returns&gt;integer code&lt;/returns&gt;
    static int generateUniqueCode(int seed)
    {
        string characters = "0123456789";

        Random randInt = new Random(seed);
        var ticks = randInt.Next();

        int code = 0;
        for (var i = 0; i &lt; characters.Length; i += 2)
        {
            if ((i + 2) &lt;= ticks)
            {
                var number = ticks;
                if (number &gt; characters.Length - 1)
                {
                    var one = double.Parse(number.ToString().Substring(0, 1));
                    var two = double.Parse(number.ToString().Substring(1, 1));
                    code += characters[Convert.ToInt32(one)];
                    code += characters[Convert.ToInt32(two)];
                }
                else
                    code += characters[number];
            }
        }
        return code;
    }

    static void Main(string[] args)
    {
        Customer customer = new Customer();

        int generatedIntCode = generateUniqueCode(1);

        customer.FirstName = "Conor";
        customer.SecondName = "MacFirbhisigh";
        customer.SetID(generatedIntCode);
        Console.WriteLine("{0}, {1} {2}", customer.ID, customer.FirstName, customer.SecondName);

        //Console.ReadKey();
    }
}
</code></pre>