diff --git a/docs/csharp/whats-new/tutorials/snippets/staticinterfaces/Program.cs b/docs/csharp/whats-new/tutorials/snippets/staticinterfaces/Program.cs
index 1be6412c1176b..7a2a291374cc7 100644
--- a/docs/csharp/whats-new/tutorials/snippets/staticinterfaces/Program.cs
+++ b/docs/csharp/whats-new/tutorials/snippets/staticinterfaces/Program.cs
@@ -9,6 +9,11 @@
Console.WriteLine(str++);
//
+//
+var instance = (UniqueInstance as ISingleton)?.Instance;
+instance.PrintMessage();
+//
+
//
var pt = new Point(3, 4);
diff --git a/docs/csharp/whats-new/tutorials/snippets/staticinterfaces/Singleton.cs b/docs/csharp/whats-new/tutorials/snippets/staticinterfaces/Singleton.cs
new file mode 100644
index 0000000000000..46e2e8e1f6712
--- /dev/null
+++ b/docs/csharp/whats-new/tutorials/snippets/staticinterfaces/Singleton.cs
@@ -0,0 +1,15 @@
+public interface ISingleton where T : new()
+{
+ public static virtual T Instance
+ {
+ get
+ {
+ field ??= new T();
+ return field;
+ }
+ private set
+ {
+ field = value;
+ }
+ }
+}
diff --git a/docs/csharp/whats-new/tutorials/snippets/staticinterfaces/UniqueInstance.cs b/docs/csharp/whats-new/tutorials/snippets/staticinterfaces/UniqueInstance.cs
new file mode 100644
index 0000000000000..66f6bf4a7d9c2
--- /dev/null
+++ b/docs/csharp/whats-new/tutorials/snippets/staticinterfaces/UniqueInstance.cs
@@ -0,0 +1,7 @@
+public class UniqueInstance : ISingleton
+{
+ public void PrintMessage()
+ {
+ Console.WriteLine("This is a unique instance");
+ }
+}
diff --git a/docs/csharp/whats-new/tutorials/snippets/staticinterfaces/staticinterfaces.csproj b/docs/csharp/whats-new/tutorials/snippets/staticinterfaces/staticinterfaces.csproj
index 2150e3797ba5e..160a73d9a758f 100644
--- a/docs/csharp/whats-new/tutorials/snippets/staticinterfaces/staticinterfaces.csproj
+++ b/docs/csharp/whats-new/tutorials/snippets/staticinterfaces/staticinterfaces.csproj
@@ -2,6 +2,7 @@
Exe
+ preview
net8.0
enable
enable
diff --git a/docs/csharp/whats-new/tutorials/static-virtual-interface-members.md b/docs/csharp/whats-new/tutorials/static-virtual-interface-members.md
index f1811e3b1260b..5e1dcb5199a31 100644
--- a/docs/csharp/whats-new/tutorials/static-virtual-interface-members.md
+++ b/docs/csharp/whats-new/tutorials/static-virtual-interface-members.md
@@ -66,6 +66,24 @@ AAAAAAAAAA
This small example demonstrates the motivation for this feature. You can use natural syntax for operators, constant values, and other static operations. You can explore these techniques when you create multiple types that rely on static members, including overloaded operators. Define the interfaces that match your types' capabilities and then declare those types' support for the new interface.
+## Static virtual interface methods
+
+You can also provide a default implementation for static methods defined in an interface. This is done with the syntax of `static` and `virtual` modifiers added to any member that should be implemented in the type implementing that interface. The following example defines the `ISingleton` interface, providing any type with a constraint that a type will implement the unique `Instance` field:
+
+:::code language="csharp" source="./snippets/staticinterfaces/Singleton.cs":::
+
+Because virtual methods aren't abstract, they must declare their body. In this case the body is the implementation of `get` and `set` of the unique `Instance` that a singleton will share.
+
+The next snippet creates a class that implements the `ISingleton` interface. This `UniqueInstance` class does not override the behavior of `PrintMessage()` method, but relies on it's original definition:
+
+:::code language="csharp" source="./snippets/staticinterfaces/UniqueInstance.cs":::
+
+You can use this `UniqueInstance` type by calling the `PrintMessage()` method:
+
+:::code language="csharp" source="./snippets/staticinterfaces/Program.cs" id="TestUniqueInstance":::
+
+which will print the message defined in the `ISingleton` interface.
+
## Generic math
The motivating scenario for allowing static methods, including operators, in interfaces is to support [generic math](../../../standard/generics/math.md) algorithms. The .NET 7 base class library contains interface definitions for many arithmetic operators, and derived interfaces that combine many arithmetic operators in an `INumber` interface. Let's apply those types to build a `Point` record that can use any numeric type for `T`. The point can be moved by some `XOffset` and `YOffset` using the `+` operator.