Ответ 1
Принципы работы интерфейсов заключаются в том, что любой объект может реализовать IList<T>
(если только он не известен как экземпляр закрытого типа, который не реализует его, я думаю) - поэтому всегда существует возможное обращение ссылочного типа к интерфейсу.
В последнем случае компилятор не желает этого делать, потому что он не знает, что T
является bool, несмотря на предыдущий оператор if
, поэтому он не знает, какое преобразование можно попробовать между MyClass<T>
и MyClass<bool>
. Допустимые преобразования в общие типы довольно ограничены, к сожалению.
Вы можете исправить это довольно легко:
return (MyClass<T>)(object) GetBoolValue(id);
Это некрасиво, но оно должно работать... и по крайней мере в этом случае он не будет вызывать никакого бокса.