Date only limited function class
Properly overriding GetHashCode()

I remember when first learning how to properly override and use GetHashCode(), that there was a rule that stated The integer returned by GetHashCode() should never change. You're violating this rule because Days is not a readonly property.

Bad practices and unnecessary code


Take a look at this snippet:  



public int CompareTo(object obj)
{
    if (obj == null)
    {
        throw new ArgumentNullException();
    }
    if (obj is DateOnly)
    {
        DateOnly other = (DateOnly) obj;
        if (other == null)
        {
            throw new ArgumentNullException();
        }
        return (this.Days).CompareTo(other.Days);
    }
    else
    {
        throw new ArgumentNullException();
    }
}



There are 2 problems in this method. 

First - you're using the is operator combined with a direct cast, instead of using the as operator. 

Second - you have a redundant if statement that will never be triggered - if (other == null), if the cast (DateOnly other = (DateOnly) obj;) fails it will crash your program, it wont return null.

And lastly you don't really need an else statement there as there is flow branching involved if you trigger the if statement you will eventually reach the return statement which will break out of the method, thus not even continuing down your code, making the else redundant.

This is how I would write this method:

public int CompareTo(object obj)
{
    if (obj == null)
    {
        throw new ArgumentNullException();
    }
    var other = obj as DateOnly;
    if (other != null)
    {
        return (this.Days).CompareTo(other.Days);
    }
    throw new ArgumentNullException();
}



In GetDayDiff(DateOnly Date) you perform 2 casts when only 1 is necessary to operate with the proper type:



long getDayDiff = (long) this.Days - (long) Date.Days;



You can just do:

long getDayDiff = this.Days - (long) Date.Days;



I'm not sure why you inherit from object, this is unnecessary, as every type in C# inherits from that class whether it will be explicitly stated changes nothing, it's just few extra letters.


Shortening the code


You can use interpolated strings instead of String.Format():



  return string.Format("{0}/{1}/{2}", Year, Month, Day);


As interpolated string:

return $"{Year}/{Month}/{Day}";



Ternary operator:


You can make use of the ternary operator here:


if (IsLeap(year))
    return 366;
else
    return 365;



Like this:

return (uint) (IsLeap(year) ? 366 : 365);


Overall design

Few concerns here:


I would just use DateTime as a backing field and utilise some of the already written methods there (I'm sure this was a design pattern but I cant think of the name right now, maybe Decorator?).
You lack range checks and overall validation of your public methods.
You're inconsistent with where you use uint and int, if you've decided that it would be good to use uint because x, y, z, why are you not using that everywhere? This will also partially solve point 2.