普通に値型にできる気がする。
参照型にしてもGCの仕事増やすだけじゃん。
public readonly unsafe struct ValueAction<T>
{
readonly delegate* managed<object, T, void> _d;
readonly object _i;
private ValueAction(delegate* managed<object, T, void> d, object i)
{
_d = d;
_i = i;
}
public void Invoke(T value) => _d(_i, value);
public static ValueAction<T> Get(Action<T> from)
{
var method = from.Method;
if (method.IsStatic) throw new ArgumentException();
return new((delegate* managed<object, T, void>)method.MethodHandle.GetFunctionPointer(), from.Target);
}
public static ValueAction<T> Get<TTarget>(delegate* managed<TTarget, T, void> pointer, TTarget target) where TTarget : class
{
return new((delegate* managed<object, T, void>)pointer, target);
}
}
当然静的メソッドはカリー化を挟む必要があるし、マルチキャストも出来ないけど、シンプルな用途ならこれで十分。
この記事によるとデリゲートは参照型の上に必要最低限のメンバの二倍のメンバを持っているらしく、ますます意味不明。(もちろん用途は理解できるが、あえて標準的に装備する必要があるほどのものかは謎)