namespace System
{
	// Represents an object whose underlying type is a value type that can also be assigned null like a reference type.
	template <typename T>
	class Nullable
	{
	private:
		T* data;

	public:
		static const Nullable<T> Null;

		Nullable()
			: data(null)
		{
		}

		Nullable(const T& newData)
			: data(const_cast<T*>(&newData))
		{
		}

		Nullable(const Nullable<T> &obj)
			: data(obj.data)
		{
		}

		bool HasValue() const { return (data != null); }
		T getValue() const { return *data; }

		operator T() const { return *data; }
	};

	template <typename T>
	const Nullable<T> Nullable<T>::Null = Nullable<T>();
}