Вызовите универсальный метод из универсального метода с точно таким же оператором where, который требует приведение? - PullRequest
0 голосов
/ 31 августа 2009

Не могу представить, что это не обман, но я не могу найти ни одного ранее подходящего вопроса. У меня есть общий метод

public T GetSetting<T>(Guid userId) where T : ISetting, new()

Это в свою очередь вызывает универсальный метод

public static ISetting CreateSetting<T>(IDictionary<string, object> data) where T:ISetting, new()

Сигнатуры T точно такие же, но компилятор требует, чтобы я приводил значение следующим образом:

return (T) BaseSetting.CreateSetting<T>(data);

Я что-то не так делаю, или это просто ограничение фреймворка?

Ответы [ 2 ]

2 голосов
/ 31 августа 2009

Метод возвращает тип ISetting. Хотя ссылка T всегда является ссылкой ISetting, ссылка ISetting не обязательно должна быть ссылкой T. Вот почему вы должны разыграть его.

1 голос
/ 31 августа 2009

Подпись CreateSetting только указывает, что он возвращает ISetting. Не требуется, чтобы ISetting был типа T.

Если вы измените подпись на

public static T CreateSetting<T>(IDictionary<string, object> data) where T:ISetting, new()

будет работать без приведения.

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