IotaLambda.Intersection
0.6.51
dotnet add package IotaLambda.Intersection --version 0.6.51
NuGet\Install-Package IotaLambda.Intersection -Version 0.6.51
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="IotaLambda.Intersection" Version="0.6.51" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add IotaLambda.Intersection --version 0.6.51
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
#r "nuget: IotaLambda.Intersection, 0.6.51"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install IotaLambda.Intersection as a Cake Addin #addin nuget:?package=IotaLambda.Intersection&version=0.6.51 // Install IotaLambda.Intersection as a Cake Tool #tool nuget:?package=IotaLambda.Intersection&version=0.6.51
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
Intersection types for C#!
Installation
Install IotaLambda.Intersection to each project containing IntersectionTypes. This will make a source generator to be executed for those types.
Install-Package IotaLambda.Intersection
In a nutshell
Consider the following model:
interface IPokemon
{
string GetNickName();
void GetHp();
void TakeDamage(int damage);
}
interface IFireType
{
void AttackWithFlamethrower(IPokemon enemy);
}
interface IFlyingType
{
void FlyTo(string city);
}
class Charizard : IPokemon, IFireType, IFlyingType
{
int hp = 120;
string location = "Cerulean City";
public string GetNickName() => "Lizardon";
public void GetHp() => hp;
public void TakeDamage(int damage) => hp -= damage;
public void AttackWithFlamethrower(IPokemon enemy) => enemy.TakeDamage(50);
public void FlyTo(string city) => location = city;
}
You can create intersection types such as:
[IntersectionType]
readonly struct SFirePokemon : IPokemon, IFireType; // S as in Shape
[IntersectionType]
readonly struct SFlyingPokemon : IPokemon, IFlyingType;
and use them as types as usual without having to colour your codebase with generic constraints like where TPokemon : IPokemon, IFlyingType
:
var ash = new Ash();
var charizard = new Charizard();
ash.Fly_Better(SFlyingPokemon.From(charizard), "Lavender Town");
public class Ash
{
public bool Fly_Better(SFlyingPokemon pokemon, string city) // No need to define generic constraints, as the intersection type already covers that!
{
if (pokemon.GetHp() <= 0)
return false;
pokemon.FlyTo(city);
DescribeTravel("flew", pokemon.AsComponent<IPokemon>(), city); // Use `AsComponent<>` to get one of the components without boxing. `AsComponent<>`s are statically typed overloads for each component!
return true;
}
public bool Fly_Normal<TPokemon>(TPokemon pokemon, string city) where TPokemon : IPokemon, IFlyingPokemon
{
if (pokemon.GetHp() <= 0)
return false;
pokemon.FlyTo(city);
DescribeTravel("flew", pokemon, city);
return true;
}
void DescribeTravel(string verb, IPokemon pokemon, string city)
{
System.Console.WriteLine($"Ash {verb} to {city} with {pokemon.GetNickName()}.")
}
}
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. |
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
-
.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.