Deprecated
A general rule of thumb is if works in C# it works in Shift. Except for those 45,000 "features" of C# that are being sunset and are not supported in Shift.
Some common rationales
- Niche - Nothing wrong with the feature/function/mechanics but very small footprint or use case. Currently not planned to be implemented to reduce the breadth of the language. Entirely open for being included at a latter time.
- Often if this feature was introduced it may be reimagined/tinkered with and not identical to how it behaves in C#.
- Any thoughts/considerations if it was introduced may accompany the niche definition.
- Relic - A part of C# that I feel shouldn't exist anymore because a similiar or better effect can be achieved via an alternative path
- Blocked - Intentionally intended to be never implemented
As mentioned in the philosophy section, if you desparate need this functionality you can achieve it via a bound C# assembly, since all C# libraries are consumable in Shift.
These features and a general thought on why is listed below.
General
- checked niche - Having math work differently inside of the block is ugly
- const niche - There currently are no field modifiers so this would break that convention. Maybe ok?
- delegate relic -Unnecessary with the introduction of Method<P,R>. Never to be introduced as the generic variant is preferred.
- event relic - Succeeded by the Event class. No need to be a keyword.
- Since the event keyword has been removed these aren't needed
- Add
- Remove
- extern niche - Likely will think up a more first class binding feature for interopt if directly supported
- extern alias niche - Never encountered use of this once
- fixed blocked - Unsafe code will not be part of Shift
- global niche/blocked - Blocked? but maybe niche. Feels unmanaged to me.
- goto blocked - This was bad day 1.
- lock niche - Do we really need this with SemaphoreSlim existing? Not against reintroducing
- managed blocked - unsafe code
- nameof relic - Strongly typed reflection makes this unnecessary
- null blocked - Null will not exist. Use Nullable<T> instead.
- out blocked
- partial blocked - No spliting definitions. Autogenerated code is evil too.
- readonly relic - Different type classes provide this functionality
- ref blocked - There is no pass by value in Shift, so ref is never needed
- sealed blocked - You should never be unable to derive from a class
- sizeof blocked - Safe but only needed with unsafe code
- stackalloc blocked - unsafe
- static relic - Achievable with libraries + records
- typeof relic - Type definitions already are type instances in C#, no need to wrap with the typeof() operator
- unchecked blocked - unsafe
- unmanaged blocked - unsafe
- unsafe blocked - unsafe
- virtual blocked - Intentional to stop derived variants changing base behavior.
- volatile niche - Modifier conversation
Properties
At the moment properties as syntactic sugar are not supported. Instead use the Property<T,G,S> service.
This is currently intentional to make it more obvious that side effects are in play with data storage.
This means these keywords aren't available
- get
- set
- value
- init
Linq Query Syntax
At the moment query syntax is not supported.
This is purely time/complexity driven. Secondarily having an embedded DSL inside of the language feels wrong. Open for being reintroduced as C# has it or in another form down the road.
This means that these keywords aren't available
- ascending
- descending
- equals
- from
- group
- into
- join
- let
- on
- orderby
- select
Access Modifiers
There are no access modifiers in Shift. Everything is public by design.
This means that these keywords aren't available
- public
- internal
- protected
- private
Reflection
Reflection has been completely overhauled. In general the entire interface for reflection and how Type in C# works, is different in Shift.
See Reflection for more context.