summaryrefslogtreecommitdiff
path: root/src/SMAPI/Utilities/PerScreen.cs
diff options
context:
space:
mode:
authorJesse Plamondon-Willard <Pathoschild@users.noreply.github.com>2022-05-01 18:16:09 -0400
committerJesse Plamondon-Willard <Pathoschild@users.noreply.github.com>2022-05-01 18:16:09 -0400
commitc8ad50dad1d706a1901798f9396f6becfea36c0e (patch)
tree28bd818a5db39ec5ece1bd141a28de955950463b /src/SMAPI/Utilities/PerScreen.cs
parent451b70953ff4c0b1b27ae0de203ad99379b45b2a (diff)
parentf78093bdb58d477b400cde3f19b70ffd6ddf833d (diff)
downloadSMAPI-c8ad50dad1d706a1901798f9396f6becfea36c0e.tar.gz
SMAPI-c8ad50dad1d706a1901798f9396f6becfea36c0e.tar.bz2
SMAPI-c8ad50dad1d706a1901798f9396f6becfea36c0e.zip
Merge branch 'develop' into stable
Diffstat (limited to 'src/SMAPI/Utilities/PerScreen.cs')
-rw-r--r--src/SMAPI/Utilities/PerScreen.cs37
1 files changed, 31 insertions, 6 deletions
diff --git a/src/SMAPI/Utilities/PerScreen.cs b/src/SMAPI/Utilities/PerScreen.cs
index 20b8fbce..1c4c56fe 100644
--- a/src/SMAPI/Utilities/PerScreen.cs
+++ b/src/SMAPI/Utilities/PerScreen.cs
@@ -1,6 +1,8 @@
using System;
using System.Collections.Generic;
using System.Linq;
+using StardewModdingAPI.Framework;
+using StardewModdingAPI.Framework.Deprecations;
namespace StardewModdingAPI.Utilities
{
@@ -37,15 +39,14 @@ namespace StardewModdingAPI.Utilities
** Public methods
*********/
/// <summary>Construct an instance.</summary>
+ /// <remarks><strong>Limitation with nullable reference types:</strong> when the underlying type <typeparamref name="T"/> is nullable, this sets the default value to null regardless of whether you marked the type parameter nullable. To avoid that, set the default value with the 'createNewState' argument instead.</remarks>
public PerScreen()
- : this(null) { }
+ : this(null, nullExpected: true) { }
/// <summary>Construct an instance.</summary>
/// <param name="createNewState">Create the initial state for a screen.</param>
public PerScreen(Func<T> createNewState)
- {
- this.CreateNewState = createNewState ?? (() => default);
- }
+ : this(createNewState, nullExpected: false) { }
/// <summary>Get all active values by screen ID. This doesn't initialize the value for a screen ID if it's not created yet.</summary>
public IEnumerable<KeyValuePair<int, T>> GetActiveValues()
@@ -59,7 +60,7 @@ namespace StardewModdingAPI.Utilities
public T GetValueForScreen(int screenId)
{
this.RemoveDeadScreens();
- return this.States.TryGetValue(screenId, out T state)
+ return this.States.TryGetValue(screenId, out T? state)
? state
: this.States[screenId] = this.CreateNewState();
}
@@ -76,13 +77,37 @@ namespace StardewModdingAPI.Utilities
/// <summary>Remove all active values.</summary>
public void ResetAllScreens()
{
- this.RemoveScreens(p => true);
+ this.RemoveScreens(_ => true);
}
/*********
** Private methods
*********/
+ /// <summary>Construct an instance.</summary>
+ /// <param name="createNewState">Create the initial state for a screen.</param>
+ /// <param name="nullExpected">Whether a null <paramref name="createNewState"/> value is expected.</param>
+ /// <remarks>This constructor only exists to maintain backwards compatibility. In SMAPI 4.0.0, the overload that passes <c>nullExpected: false</c> should throw an exception instead.</remarks>
+ private PerScreen(Func<T>? createNewState, bool nullExpected)
+ {
+ if (createNewState is null)
+ {
+ createNewState = (() => default!);
+
+ if (!nullExpected)
+ {
+ SCore.DeprecationManager.Warn(
+ SCore.DeprecationManager.GetModFromStack(),
+ $"calling the {nameof(PerScreen<T>)} constructor with null",
+ "3.14.0",
+ DeprecationLevel.Notice
+ );
+ }
+ }
+
+ this.CreateNewState = createNewState;
+ }
+
/// <summary>Remove screens which are no longer active.</summary>
private void RemoveDeadScreens()
{