akka-aspire-configurat…
Configure Akka.NET with .NET Aspire for local development and production deployments. Covers actor system setup, clustering,…
Guidelines for introducing and using nullable reference types (NRT) and System.Diagnostics.CodeAnalysis nullable attributes in C# / .NET codebases. Covers the nullability model, flow analysis, the null-forgiving operator, API design rules, the full attribute catalog (AllowNull,
Claude Code
$ npx -y skills add aaronontheweb/dotnet-skills --skill csharp-nullable-reference-types --agent claude-code
Codex
$ npx skills add aaronontheweb/dotnet-skills --skill csharp-nullable-reference-types -a codex -y
Cursor
$ npx skills add aaronontheweb/dotnet-skills --skill csharp-nullable-reference-types -a cursor -y
Gemini CLI
$ npx skills add aaronontheweb/dotnet-skills --skill csharp-nullable-reference-types -a gemini-cli -y
GitHub Copilot
$ npx skills add aaronontheweb/dotnet-skills --skill csharp-nullable-reference-types -a github-copilot -y
OpenCode
$ npx skills add aaronontheweb/dotnet-skills --skill csharp-nullable-reference-types -a opencode -y
Windsurf
$ npx skills add aaronontheweb/dotnet-skills --skill csharp-nullable-reference-types -a windsurf -y
name: csharp-nullable-reference-types description: Guidelines for introducing and using nullable reference types (NRT) and System.Diagnostics.CodeAnalysis nullable attributes in C# / .NET codebases. Covers the nullability model, flow analysis, the null-forgiving operator, API design rules, the full attribute catalog (AllowNull, DisallowNull, MaybeNull, NotNull, NotNullWhen, MaybeNullWhen, NotNullIfNotNull, MemberNotNull, MemberNotNullWhen, DoesNotReturn, DoesNotReturnIf), the C# 14 field keyword, incremental migration of legacy codebases, and a code-generation checklist. version: 1.0.0 tags: - csharp - nullable - nrt - code-quality - api-design
string name = "Alice"; name = null; // Warning: assigning null to non-nullable. string? nickname = null; Console.WriteLine(nickname.Length); // Warning: possible null dereference.
The compiler tracks whether a reference is *definitely non-null* or *maybe null*. Null checks and assignments update this state.
string? message = GetMessageOrNull();
if (message != null)
{
// message is definitely non-null in this block.
Console.WriteLine(message.Length);
}
// Outside the if, message is maybe null again.Introduce explicit null checks (`if (x != null)`, `is not null`, pattern matching) before dereferencing nullable values. Narrow nullability early and keep the non-null state alive. **Null-conditional assignment (C# 14)** lets you write `customer?.Order = CreateOrder();` — the right side is evaluated only when the receiver is non-null.
`x!` tells the compiler "treat `x` as non-null here." It affects analysis only, not runtime behavior.
_customer = LoadCustomerFromOrm()!; // ORM guarantees this is not null in valid state.
A successful guard clause or pattern match already creates a null-safe region in the current scope. Before adding `!`, make nullable values cross a checked boundary once and keep the remaining code non-nullable:
public void Process(Order? order)
{
if (order?.Customer is not { } customer)
{
return;
}
// The pattern match already proved that customer is non-null here.
Console.WriteLine(customer.Name);
}Do not extract a function solely to satisfy nullable analysis. Use an explicit non-nullable function boundary when it also simplifies a large or branching implementation. Use `!` only when a real external invariant cannot be represented through control flow, signatures, or nullable-analysis attributes.
Enable NRT for new code:
<PropertyGroup> <Nullable>enable</Nullable> </PropertyGroup>
For legacy codebases, enable incrementally with file-level directives (`#nullable enable`, `#nullable disable`, `#nullable enable warnings`, `#nullable enable annotations`). Treat `CS86xx` nullable warnings as important; consider `TreatWarningsAsErrors` or treating nullable warnings as errors in new projects.
See [nrt-migration-playbook-reference.md](nrt-migration-playbook-reference.md) for the full incremental-adoption strategy, `#nullable` directive reference, legacy interop, and known static-analysis limitations (arrays, `default(struct)`).
These rules apply to public and internal APIs and to models.
**Parameters** — if `null` is not allowed, use a non-nullable type and add a runtime guard for public APIs:
public void SendEmail(string recipient)
{
ArgumentNullException.ThrowIfNull(recipient);
// Implementation
}If `null` is allowed and meaningful, use `T?`, document how `null` is interpreted, and implement correct `null` behavior.
**Return types** — `Customer` when the method never returns `null`; `Customer?` when it can legitimately return `null` (callers must check, and the compiler enforces it).
public Customer GetRequiredCustomer(Guid id); // Throws on failure. public Customer? TryGetCustomer(Guid id); // Returns null on failure.
**Properties and fields** — follow the same rules as parameters and return types. Non-nul
A comprehensive AI coding plugin with 30 skills and 5 specialized agents for professional .NET development. Battle-tested patterns from production systems covering C#, Akka.NET, Aspire, EF Core, testing, and performance optimization.
Configure Akka.NET with .NET Aspire for local development and production deployments. Covers actor system setup, clustering,…
Critical Akka.NET best practices including EventStream vs DistributedPubSub, supervision strategies, error handling, Props vs…
Patterns for building entity actors with Akka.Hosting - GenericChildPerEntityParent, message extractors, cluster sharding…
Akka.Management for cluster bootstrapping, service discovery (Kubernetes, Azure, Config), health checks, and dynamic cluster…
Write unit and integration tests for Akka.NET actors using modern Akka.Hosting.TestKit patterns. Covers dependency injection,…
Guidelines for making .NET libraries and applications trimming-safe and Native AOT compatible. Covers the trimming/AOT model, the…
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…
Ask which skill or flow fits your situation. A router over the skills in this repo.