次のデリゲート「呼び出し元」署名を想定します。
FuncCaller<T>(Func<T, bool> predicate)
およびマッチング方法:
bool MyFunc(object o)
が参照型の場合、次のように暗黙的T
に呼び出すことができます。MyFunc
FuncCaller<String>(MyFunc) // valid
逆に、T
が値型の場合、MyFuncを暗黙的に呼び出すと、コンパイルエラーが発生します。
FuncCaller<Int32>(MyFunc) // invalid ("No overload for 'MyFunc(object)' matches delegate 'System.Func<int?,bool>'")
私の質問は、これら2つの例を考えると、MyFunc
暗黙的に呼び出された場合は無効の呼び出しであるのに、次のように明示的に呼び出された場合は有効である理由です。
FuncCaller<Int32>(i => MyFunc(i)) // valid
これは、タイプのボックス化とボックス化解除に関連するある種の問題だと思いますか?