diff --git a/src/Discord.Net/API/DiscordRawClient.cs b/src/Discord.Net/API/DiscordRawClient.cs index 31e4701a9..b4b3d1377 100644 --- a/src/Discord.Net/API/DiscordRawClient.cs +++ b/src/Discord.Net/API/DiscordRawClient.cs @@ -473,7 +473,7 @@ namespace Discord.API if (args.Limit <= 0) throw new ArgumentOutOfRangeException(nameof(args.Limit)); if (args.Offset < 0) throw new ArgumentOutOfRangeException(nameof(args.Offset)); - int limit = args.Limit.IsSpecified ? args.Limit.Value : int.MaxValue; + int limit = args.Limit.GetValueOrDefault(int.MaxValue); int offset = args.Offset; List result; diff --git a/src/Discord.Net/API/Optional.cs b/src/Discord.Net/API/Optional.cs index 172d0ecab..e76d170e5 100644 --- a/src/Discord.Net/API/Optional.cs +++ b/src/Discord.Net/API/Optional.cs @@ -1,26 +1,48 @@ -namespace Discord.API +using System; + +namespace Discord.API { + //Based on https://github.com/dotnet/coreclr/blob/master/src/mscorlib/src/System/Nullable.cs public struct Optional : IOptional { + private readonly T _value; + /// Gets the value for this paramter, or default(T) if unspecified. - public T Value { get; } + public T Value + { + get + { + if (!IsSpecified) + throw new InvalidOperationException("This property has no value set."); + return _value; + } + } /// Returns true if this value has been specified. public bool IsSpecified { get; } - object IOptional.Value => Value; + object IOptional.Value => _value; /// Creates a new Parameter with the provided value. public Optional(T value) { - Value = value; + _value = value; IsSpecified = true; } + + public T GetValueOrDefault() => _value; + public T GetValueOrDefault(T defaultValue) => IsSpecified ? _value : default(T); - /// Implicitly creates a new Parameter from an existing value. - public static implicit operator Optional(T value) => new Optional(value); - /// Implicitly creates a new Parameter from an existing value. - public static implicit operator T(Optional param) => param.Value; + public override bool Equals(object other) + { + if (!IsSpecified) return other == null; + if (other == null) return false; + return _value.Equals(other); + } - public override string ToString() => IsSpecified ? (Value?.ToString() ?? null) : null; + public override int GetHashCode() => IsSpecified ? _value.GetHashCode() : 0; + public override string ToString() => IsSpecified ? _value.ToString() : ""; + + public static implicit operator Optional(T value) => new Optional(value); + public static implicit operator T(Optional value) => value.Value; } }