Ограниченный универсальный делегат в C # - PullRequest
4 голосов
/ 14 января 2010

Я хотел бы иметь делегата, который должен возвращать один из двух типов; ActionResult или строка . Возможно ли это?

Ответы [ 4 ]

6 голосов
/ 14 января 2010

Нет, это невозможно (по крайней мере, в C # 4 и ниже). Отсутствует поддержка ограничений "или" для параметров универсального типа.

Также нет ограничения, ограничивающего аргумент типа точным типом. Все ограничения ограничивают базовые типы аргумента типа. Они не могут ограничить вас от наследования.

2 голосов
/ 14 января 2010

Как объяснили другие ответы, вы не можете сделать это, однако вы можете обойти это, передавая различные продолжения для каждого возвращаемого типа:

public delegate void MultiPathDelegate(Action<ActionResult> arAction, Action<string> strAction);

Таким образом, проверка типа возврата происходит в делегате, а не в вызывающей стороне.

2 голосов
/ 14 января 2010

Нет, это не так. Кроме того, какая польза от этого? Если два типа не имеют ничего общего, то вы ничего не можете сделать с типом возвращаемого значения.

Рассмотрим код, вызывающий делегата:

var returnValue = someDelegate();

Какой тип var в этом случае? Единственный общий предок string и ActionResult - это object, так что это все, что вы можете от него получить. С точки зрения статической типизации вы можете просто объявить тип возвращаемого значения как object.

0 голосов
/ 14 января 2010

Как и Закальве, я тоже не вижу смысла в этом, но ..

Вы можете определить два перегруженных метода, которые принимают Func<string> и Func<ActionResult> соответственно. Закрытый метод может взять делегат и делать с ним дальнейшие действия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...