2013-03-29 3 views
5

Как добавить новую функцию в делегат без использования символа + =?Добавление делегата в C#

Мне интересно, как сделать его из другого языка CLR, а именно F #. (Я знаю, что есть гораздо лучше способ справиться с событиями в F #, но я будучи любопытным ..)

static int Square (int x) { return x * x; } 
static int Cube(int x) { return x * x * x; } 
delegate int Transformer (int x); 

Transformer d = Square ; 
d += Cube; 

Редактировать

Как отметил Даниил в комментариях, тот факт, что один не имеет прямого способа сделать это, вероятно, является конструктивным решением команды dotnet не слишком мутировать очередь.

+0

вы хотите ответить на '' F #? –

+0

Почему бы и нет, по крайней мере, без + = синтаксического сахара – nicolas

+0

просто, у вас вопрос, есть C# в заголовке –

ответ

6

Вот один из способов сделать это в F #. Вам нужно понижающее приведение из-за использования Delegate.Combine:

let square x = x * x 
let cube x = x * x * x 

type Transformer = delegate of int -> int 

let inline (++) (a: 'T) (b: 'T) = 
    System.Delegate.Combine(a, b) :?> 'T 

let d = Transformer(square) 
let e = d ++ Transformer(cube) 
+0

Да, это единственное, что я видел. преимущество этого письма заключается в том, что это обеспечивает безопасность типов, которую мы должны обеспечить сами. – nicolas

2

Делегат. Комбинат?

d = (Transformer) Delegate.Combine(d, new Transformer(Cube)); 
+0

действительно. только путь .. теперь, чтобы обернуть это безопасным способом типа, cf pad ответ. – nicolas

Смежные вопросы