패턴매칭에서 값매칭은 상수(const)로밖에 못하는데, C# 은 컴파일 시점의 상수계산에 베타적인편이다. 전처리연산도 몇개 없다.

컴파일타임과 런타임을 구분하지 않는다는 zig가 매려워지는 시점이다. 근데 걔는 패턴매칭이 있나..?


구조체는 커녕 튜플상수도 못만드는 와중에 참조타입인 문자열은 상수를 만들수 있고, ReadOnlySpan<char>은 문자열처럼 다룰수 있다는걸 활용하여

구조체를 억지로 문자열 패턴매칭을 시킬수가 있다. c# 의 char는 2바이트이니 혹시 홀수크기의 구조체만 아니라면 능히 매칭시킬수 있다.


구조체가 가질수 있는 특정한 값을 상수문자열로 제너레이션 해주는 라이브러리까지 만들고 싶었으나 적당한 방법이 떠오르지 않았다.


using System.Runtime.InteropServices;
using System.Runtime.CompilerServices;

static void Deconstruct<T>(this ref T t, out ReadOnlySpan<char> span) where T : struct
    => span = MemoryMarshal.Cast<T, char>(new ReadOnlySpan<T>(ref t));

struct BIN { public byte a, b, c, d; }
var bin = new BIN { a = 1, b = 2, c = 3, d = 4 };

(bin is BIN("\x0201\x0403")).Display();

(bin is BIN([(char)0x0201, (char)0x0403])).Display();

static void Deconstruct(this char c, out byte b1, out byte b2)
    => (b1, b2) = ((byte)(c & 0xff), (byte)(c >> 8));

(bin is BIN([(1, 2), (_, 4)])).Display();