С помощью выражений lamba и инициализаторов классов вы можете получить то же поведение, приложив немного усилий.
public class Example {
public Action DoStuff;
public Action<int> DoStuffWithParameter;
public Func<int> DoStuffWithReturnValue;
}
class Program {
static void Main(string[] args) {
var x = new Example() {
DoStuff = () => {
Console.WriteLine("Did Stuff");
},
DoStuffWithParameter = (p) => {
Console.WriteLine("Did Stuff with parameter " + p);
},
DoStuffWithReturnValue = () => { return 99; }
};
x.DoStuff();
x.DoStuffWithParameter(10);
int value = x.DoStuffWithReturnValue();
Console.WriteLine("Return value " + value);
Console.ReadLine();
}
}
Одна проблема с этим решением, которое я только что осознал, заключается в том, что если бы вы создали поля в классе Example, лямбда-выражения не могли получить доступ к этим полям.
Однако нет никакой причины, по которой вы не могли бы передать экземпляр Example лямбда-выражениям, которые предоставили бы им доступ к любому общедоступному состоянию, которое может содержать этот пример. AFAIK, который был бы функционально эквивалентен внутреннему классу Anonymous Java.
P.S. Если вы собираетесь проголосовать за ответ ниже, сделайте нам одолжение и добавьте комментарий о том, почему вы не согласны: -)