Невозможно назначить делегата одного типа другому, даже если подпись совпадает - PullRequest
11 голосов
/ 17 декабря 2010

Мое болезненное любопытство заставляет меня задуматься, почему не получается следующее:

// declared somewhere
public delegate int BinaryOperation(int a, int b);

// ... in a method body
Func<int, int, int> addThem = (x, y) => x + y;

BinaryOperation b1 = addThem; // doesn't compile, and casting doesn't compile
BinaryOperation b2 = (x, y) => x + y; // compiles!

Ответы [ 2 ]

16 голосов
/ 17 декабря 2010

C # имеет очень ограниченную поддержку для "структурной" типизации. В частности, вы не можете привести один тип делегата к другому просто , потому что их объявления похожи.

Из спецификации языка:

Типы делегатов в C # - это name эквивалентно, не структурно эквивалент. В частности, два различные типы делегатов, которые имеют те же списки параметров и тип возврата считаются разными делегатами типы.

Попробуйте один из:

// C# 2, 3, 4 (C# 1 doesn't come into it because of generics)
BinaryOperation b1 = new BinaryOperation(addThem);

// C# 3, 4
BinaryOperation b1 = (x, y) => addThem(x, y);
var b1 = new BinaryOperation(addThem);
7 голосов
/ 17 декабря 2010

Вот аналогичный вопрос: почему эта компиляция не выполняется?

// declared somewhere
struct Foo {
    public int x;
    public int y;
}

struct Bar {
    public int x;
    public int y;
}

// ... in a method body
Foo item = new Foo { x = 1, y = 2 };

Bar b1 = item; // doesn't compile, and casting doesn't compile
Bar b2 = new Bar { x = 1, y = 2 }; // compiles!

В этом случае кажется, что приведение не работает более естественно, но на самом деле это та же причина.

...