Skip to content

Add more C# language features and syntax sugar to highlightning #239

@deeprobin

Description

@deeprobin

See github-linguist/linguist#5838

Describe the enhancement

Currently not all syntax features of C# are highlighted.
My suggestion includes the following (if you would find something missing, feel free to add):

Missing features

For the sake of completeness, I have tried to explicitly assign a feature to a language version here. I could not find the associated standard/proposal for each feature but they do exist.

Standard (Draft v6)

C# language standard - ECMA-TC49-TG2

Unsafe blocks (ECMA Draftv6 22.2)

public void Method() {
    unsafe {
        // Unsafe operations
    }
}

Pointers & pointer fixture (ECMA Draftv6 22.7)

public unsafe void Method() {
    fixed(int* ptr = &refVar) {
        // Some cool pointer operations
    }
}

C# 9

Native Integer Primitives (CSharp 9.0 Proposal)

public void Method() {
    nint myNativeInteger = -123;
    nuint myNativeUnsignedInteger = 123;
}
public void Method(nint param1, nuint param2) {}

Function pointers (CSharp 9.0 Proposal)

public void Method() {
    delegate* managed<int, int>;
    delegate* unmanaged<int, int>;
    delegate* unmanaged[Cdecl] <int, int>;
    delegate* unmanaged[Stdcall, SuppressGCTransition] <int, int>;
}

Static anonymous functions (CSharp 9.0 Proposal)

public void X() {
    Y(static (i) => i + 1);
    Y(static i => i + 1);
}

public void Y(Func<int, int> x) {}

With expressions (CSharp 9.0 Proposal)

public record MyRecord(string Name);
public MyRecord ModifyName(MyRecord rec) {
    return rec with { Name = "My new name" };
}

C# 10

Global Using Directives (CSharp 10.0 Proposal)

global using System;
global using System.Linq;
global using System.Runtime.CompilerServices;

Records (CSharp 10.0 Proposal)

public partial record struct Record {}
public partial sealed record Record {}
public record struct Record {}
public sealed record Record {}

Enhanced Pattern Matching (CSharp 9.0 Proposal + CSharp 10.0 Proposal)

void M(object o1, object o2)
{
    var t = (o1, o2);
    if (t is (int, string)) {} 
    switch (o1) {
        case int: break; 
        case string: break; 
    }
}

bool IsLetter(char c) => c is (>= 'a' and <= 'z') or (>= 'A' and <= 'Z');

Null checks

public void Method(object? nullable) {
    if(nullable is null) {}
    if(nullable is not null) {}
}

Defaults

public void X() {
    int x = default;
}

implicit new

public void Method() {
    MyKnownType value = new();
}

Wrong implemented features

Extension method resolving

namespace N1
{
    public static class D
    {
        public static void F(this int i) => Console.WriteLine($"D.F({i})");
    }
}

namespace N2
{
    using N1;

    class Test
    {
        static void Main(string[] args)
        {
            1.F();
            // ^^ Why is this red?
        }
    }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions