c# - usos - ¿Diferencia entre varias formas de crear instancias de un delegado(Func<T, T>)?
microsoft csharp runtimebinder runtimebinderexception no se puede invocar un tipo no delegado (2)
1 :
Func<int, int> myFunc = new Func<int,int>(delegate(int x) {
return x + 1;
});
2 :
Func<int, int> myFunc = delegate(int x) {
return x + 1;
};
3 :
Func<int, int> myFunc = x => x + 1;
¿Cuál es la diferencia entre ellos?
Son todos iguales. Los dos primeros son ejemplos de métodos anónimos . El último es un ejemplo de una expresión lambda . Los métodos anónimos y las expresiones lambda se denominan colectivamente funciones anónimas .
Los métodos anónimos se introdujeron en C # 2; Las expresiones lambda se introdujeron en C # 3 y en su mayoría reemplazaron a los métodos anónimos. Tenga en cuenta que las expresiones lambda también se pueden convertir en árboles de expresiones que representan el código como datos en lugar de IL, así como también como delegados.
Tenga en cuenta que Func<TResult>
, Func<T, TResult>
etc. son solo ejemplos de tipos de delegados. Puede convertir funciones anónimas a cualquier tipo de delegado compatible. Por ejemplo:
public delegate int Foo(string x);
Foo foo = text => text.Length;
Son todos iguales: solo azúcar sintáctico que compila a la misma cosa.
Es decir, con la inferencia de tipo y otros elementos del compilador, 3 es solo una manera muy corta de decir 1.