C# language support
WebSharper supports a subset of C# syntax and features, allowing you to write C# code that compiles to JavaScript. Furthermore, WebSharper provides interoperability between C# and F#, enabling you to use both languages in a single solution. The standard .NET interoperability between the two languages can be used, and WebSharper extends this by a (set of helper functions)[interoperability-with-f].
Supported C# syntax
- classes, records, interfaces, enums
- control flow:
if,switch,try/catch/finally,break,continue,return,throw,yield return,while,do/while,for,foreach,using, labels/goto - pattern matching and deconstruction
- literals
- anonymous functions
- anonymous objects
- local functions
- operators (including user-defined operator overloading)
- interpolated strings (missing: padding)
- await on
Task,Task<TResult> - conditional access (
?.) and null-coalescing (??) operators - assignments (including composite assignment operators)
ref,in, andoutparameters, andrefreturn values- optional parameters, default value
- delegates (having
Combine,Remove,Target) - implicit and explicit casts (including user-defined implicit/explicit operators), missing: numeric explicit casts (see planned) properly truncating value
- collection initializers (including dictionary initializers)
- query expressions -
from ... select ... - generator methods (with limitations: see planned features)
- async methods returning
Task,Task<TResult>(with limitations: see planned features) dynamictype for easy JavaScript interop
C# features and fixes planned
These features and fixes are planned for later release.
- struct definitions
- numeric explicit casts truncating value (currently does nothing, it is recommended to use
System.Mathmethods instead) checked/unchecked- padding in string interpolation
- resolving current limitations of generator and async methods: block-scoped variables and try/finally does not currently work inside a method transformed to a state-machine
- nullable operators should be absorbing (
null + 1equalsnullin .NET) IndexandRangetypes
C# keywords not available for JavaScript
These keywords are used for interoperability with unmanaged code or in multi-threaded environment which is not supported by WebSharper:
typeofsizeoffixedunsafelock
Interoperability with F#
There are helper classes included in WebSharper for most common conversions between FSharp.Core and standard .NET types.
These conversions work both on server and client side.
Create F# values from standard .NET counterparts
The WebSharper.FSharpConvert static class contains static members to create values used commonly in F#.
FSharpConvert.Funoverloads create curried F# functions for 1-8 arguments fromSystem.ActionandSystem.Funcdelegate values.FSharpConvert.Optionoverloads create anFSharpOption<T>value from a value of a .NET reference type orNullablevalue type. (To create a 1)FSharpConvert.Listoverloads create anFSharpList.FSharpConvert.Asyncoverloads create anFSharpAsync<TResult>from aTaskorTask<TResult>.FSharpConvert.Refoverloads create anFSharpRefobject with specified initial value or default value for a type.Option.Noneand F#unitvalues can be justnull.
Consume F# values from C#
Everything works as in .NET, there are no extra helpers provided by WebSharper.
- To call an
FSharpFuncfunction, use itsInvokemethod. When calling curried F# functions, you have to chain callingInvoketo pass all arguments separately. - Create F# union values using the
.New...static method in the union type (or property for a union case with no fields). - Create F# record values by using its constructor.
- Separate union cases by using the
Is...methods, or theTagproperty. Whenever a union hasnullas possible value, these methods are static. - For the
FSharpOptiontype, you can usex?.Value) to get the value or null.