デリゲートのみを使用できる特別なユースケースを見つけました。
public delegate bool WndEnumProc(IntPtr hwnd, IntPtr lParam);
[DllImport("User32.dll")]
public static extern bool EnumWindows(WndEnumProc lpEnumFunc, IntPtr lParam);
Func/Action を使用しても機能しません: 'Namespace.Class.WndEnumProc' is a 'field' but is used like a 'type'
:
public Func<IntPtr, IntPtr, bool> WndEnumProc;
[DllImport("User32.dll")]
public static extern bool EnumWindows(WndEnumProc lpEnumFunc, IntPtr lParam);
System.Runtime.InteropServices.DllImportAttribute
次のコードはコンパイルされますが、ジェネリック型のマーシャリングをサポートしていないため、実行時に例外がスローされます。
[DllImport("User32.dll")]
public static extern bool EnumWindows(Func<IntPtr, IntPtr, bool> lpEnumFunc, IntPtr lParam);
この例をすべての人に示すために提示します。デリゲートが唯一の選択肢である場合もあります。そして、これはあなたの質問に対する合理的な答えですwhy not use Action<T>/Func<T> ?