5

I've seen a function that looks something like this:

function { [CmdletBinding()] [OutputType([Boolean])] param ( [bool] $param } # ... } 

What is the difference here between Boolean and bool?

2 Answers 2

6

[bool] is a powershell type accelerator.

I'm in powershell 7. If it's officially documented somewhere, I can't find it (besides Windows Powershell in Action, as usual).

[psobject].Assembly.GetType("System.Management.Automation.TypeAccelerators")::get Key Value --- ----- Alias System.Management.Automation.AliasAttribute AllowEmptyCollection System.Management.Automation.AllowEmptyCollectionAttribute AllowEmptyString System.Management.Automation.AllowEmptyStringAttribute AllowNull System.Management.Automation.AllowNullAttribute ArgumentCompleter System.Management.Automation.ArgumentCompleterAttribute ArgumentCompletions System.Management.Automation.ArgumentCompletionsAttribute array System.Array bool System.Boolean byte System.Byte char System.Char CmdletBinding System.Management.Automation.CmdletBindingAttribute datetime System.DateTime decimal System.Decimal double System.Double DscResource System.Management.Automation.DscResourceAttribute ExperimentAction System.Management.Automation.ExperimentAction Experimental System.Management.Automation.ExperimentalAttribute ExperimentalFeature System.Management.Automation.ExperimentalFeature float System.Single single System.Single guid System.Guid hashtable System.Collections.Hashtable int System.Int32 int32 System.Int32 short System.Int16 int16 System.Int16 long System.Int64 int64 System.Int64 ciminstance Microsoft.Management.Infrastructure.CimInstance cimclass Microsoft.Management.Infrastructure.CimClass cimtype Microsoft.Management.Infrastructure.CimType cimconverter Microsoft.Management.Infrastructure.CimConverter IPEndpoint System.Net.IPEndPoint NullString System.Management.Automation.Language.NullString OutputType System.Management.Automation.OutputTypeAttribute ObjectSecurity System.Security.AccessControl.ObjectSecurity Parameter System.Management.Automation.ParameterAttribute PhysicalAddress System.Net.NetworkInformation.PhysicalAddress pscredential System.Management.Automation.PSCredential PSDefaultValue System.Management.Automation.PSDefaultValueAttribute pslistmodifier System.Management.Automation.PSListModifier psobject System.Management.Automation.PSObject pscustomobject System.Management.Automation.PSObject psprimitivedictionary System.Management.Automation.PSPrimitiveDictionary ref System.Management.Automation.PSReference PSTypeNameAttribute System.Management.Automation.PSTypeNameAttribute regex System.Text.RegularExpressions.Regex DscProperty System.Management.Automation.DscPropertyAttribute sbyte System.SByte string System.String SupportsWildcards System.Management.Automation.SupportsWildcardsAttribute switch System.Management.Automation.SwitchParameter cultureinfo System.Globalization.CultureInfo bigint System.Numerics.BigInteger securestring System.Security.SecureString timespan System.TimeSpan ushort System.UInt16 uint16 System.UInt16 uint System.UInt32 uint32 System.UInt32 ulong System.UInt64 uint64 System.UInt64 uri System.Uri ValidateCount System.Management.Automation.ValidateCountAttribute ValidateDrive System.Management.Automation.ValidateDriveAttribute ValidateLength System.Management.Automation.ValidateLengthAttribute ValidateNotNull System.Management.Automation.ValidateNotNullAttribute ValidateNotNullOrEmpty System.Management.Automation.ValidateNotNullOrEmptyAttribute ValidatePattern System.Management.Automation.ValidatePatternAttribute ValidateRange System.Management.Automation.ValidateRangeAttribute ValidateScript System.Management.Automation.ValidateScriptAttribute ValidateSet System.Management.Automation.ValidateSetAttribute ValidateTrustedData System.Management.Automation.ValidateTrustedDataAttribute ValidateUserDrive System.Management.Automation.ValidateUserDriveAttribute version System.Version void System.Void ipaddress System.Net.IPAddress DscLocalConfigurationManager System.Management.Automation.DscLocalConfigurationManagerAttribute WildcardPattern System.Management.Automation.WildcardPattern X509Certificate System.Security.Cryptography.X509Certificates.X509Certificate X500DistinguishedName System.Security.Cryptography.X509Certificates.X500DistinguishedName xml System.Xml.XmlDocument CimSession Microsoft.Management.Infrastructure.CimSession mailaddress System.Net.Mail.MailAddress semver System.Management.Automation.SemanticVersion scriptblock System.Management.Automation.ScriptBlock pspropertyexpression Microsoft.PowerShell.Commands.PSPropertyExpression psvariable System.Management.Automation.PSVariable type System.Type psmoduleinfo System.Management.Automation.PSModuleInfo powershell System.Management.Automation.PowerShell runspacefactory System.Management.Automation.Runspaces.RunspaceFactory runspace System.Management.Automation.Runspaces.Runspace initialsessionstate System.Management.Automation.Runspaces.InitialSessionState psscriptmethod System.Management.Automation.PSScriptMethod psscriptproperty System.Management.Automation.PSScriptProperty psnoteproperty System.Management.Automation.PSNoteProperty psaliasproperty System.Management.Automation.PSAliasProperty psvariableproperty System.Management.Automation.PSVa 

Make your own:

$Accelerators = [PowerShell].Assembly.GetType("System.Management.Automation.TypeAccelerators") $Accelerators::Add('dt','system.datetime') [dt]'1:00' Saturday, February 22, 2020 1:00:00 AM 
Sign up to request clarification or add additional context in comments.

1 Comment

Good point that it's not documented; let's try to fix that. Given that System.Management.Automation.TypeAccelerators isn't public, I'd be careful with using its Add() method to define custom accelerators; in PSv5+ it's better to use using namespace (while not fully equivalent, it at least allows you to omit the namespace part from type literals).
4

bool is an alias for System.Boolean just as int is an alias for System.Int32.

example

PS C:\Users\aruns7> [bool] $yourValue = 1 PS C:\Users\aruns7> $yourValue.gettype().fullname System.Boolean 

Boolean represents the System.Boolean class while bool is the keyword for the System.Boolean that we can use to create Boolean objects.

1 Comment

While your answer is helpful, do note that bool is technically not a keyword: [bool] is a type literal that uses a type accelerator, as shown in js2010's answer. Also, in .NET terms System.Boolean is technically not a class, but a struct (a value type).

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.