En primer lugar, sus dos ejemplos están haciendo dos cosas totalmente separadas. El primero es declarar una variable delegada genérica y asignarle un valor, el segundo es simplemente definir un delegate
tipo. Su ejemplo, más completo, sería:
public static class Program
{
public delegate string ConvertedMethod(string value);
public static void Main()
{
Func<string, string> convertedMethod = s => s + ", Hello!";
ConvertedMethod convertedMethod2 = s => s + ", Hello!";
}
}
Pero más concretamente, ambos Func<string,string>
y delegate string convertMethod(string)
serían capaces de contener las mismas definiciones de método, ya sean métodos, métodos anónimos o expresiones lambda.
En cuanto a cuál debe utilizar, depende de la situación. Si desea que su delegado se defina más por lo que toma y devuelve, entonces los delegados genéricos son perfectos. Si desea que el delegado tiene un nombre especial que le da una mayor definición de lo que el delegado debe hacer (más allá del simple Action
, Predicate
, etc), entonces la creación de su propio delegado es siempre una opción.