Badeend.Nothing
1.0.2
Prefix Reserved
dotnet add package Badeend.Nothing --version 1.0.2
NuGet\Install-Package Badeend.Nothing -Version 1.0.2
<PackageReference Include="Badeend.Nothing" Version="1.0.2" />
paket add Badeend.Nothing --version 1.0.2
#r "nuget: Badeend.Nothing, 1.0.2"
// Install Badeend.Nothing as a Cake Addin #addin nuget:?package=Badeend.Nothing&version=1.0.2 // Install Badeend.Nothing as a Cake Tool #tool nuget:?package=Badeend.Nothing&version=1.0.2
Badeend.Nothing
is struct that contains... well... nothing!
Also known as a "unit" type in Functional Programming parlance.
In C# this can be used in places where you have nothing to return, but void
is not allowed. Most notably: generics.
Example time!
Let's assume there exists an interface that you want to implement:
public interface IHandler<T>
{
T Handle(MyInput input);
}
If your handler has nothing useful to return, then you would want to write this:
public class MyHandler : IHandler<void> // COMPILE ERROR!
{
void Handle(MyInput input)
{
// (my implementation here)
}
}
Unfortunately, "Computer Says No". C# won't let you.
If you're lucky enough to own that interface, you could decide to duplicate the interface and all related code: one for IHandler
, and one for IHandler<T>
.
If you're not able to change the interface or just don't feel like doing a bunch of unnecessary work; you could also change the type argument to Nothing
:
using Badeend;
public class MyHandler : IHandler<Nothing> // <--- Nothing to see here
{
Nothing Handle(MyInput input)
{
// (my implementation here)
return Nothing.Value;
}
}
Fake nothing
keyword
Depending on how intensively you use this package, you might be interested in using Badeend.Globals.NothingKeyword
, which exposes nothing
as a top level field.
using Badeend;
public class MyHandler : IHandler<Nothing>
{
Nothing Handle(MyInput input)
{
// (my implementation here)
return nothing; // <--- Note the lowercase 'n'
}
}
In C#10+ this can be configured as follows:
global using static Badeend.Globals.NothingKeyword;
or:
<ItemGroup>
<Using Include="Badeend.Globals.NothingKeyword" Static="True" />
</ItemGroup>
Shameless self-promotion
May I interest you in one of my other packages?
- Badeend.ValueCollections: Low overhead immutable collection types with structural equality.
- Badeend.EnumClass: Discriminated unions for C# with exhaustiveness checking.
- Badeend.Result: For failures that are not exceptional:
Result<T,E>
for C#. - Badeend.Any: Holds any value of any type, without boxing small structs (up to 8 bytes).
- Badeend.Nothing: If you want to use
void
as a type parameter, but C# won't let you.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
.NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.