Это не работает из-за заботы о Ковариантности. Рассмотрим этот пример кода.
public class SomeModel2: IBasicModel {
public string _id { get; set; }
/* some other properties! */
}
После этого вы можете передать, например, некоторый объект SomeModel2 в метод Save метода x, и, очевидно, это не так.
ISomeModelAbstract<IBasicModel> x = new ConcreteClass();
var m = new SomeModel2();
x.Save(m);
Чтобы предотвратить это, вы должны неявно сказать, что вы используете свой универсальный тип только в местах возврата (выхода), а не во входных данных. Например:
public interface ISomeModelAbstract<out T> where T: IBasicModel
И после этого, к сожалению, вы не можете использовать метод Save and Update в вашем интерфейсе ISomeModelAbstract. Потому что они используют T в месте ввода параметров.
Для получения дополнительной информации см. Ссылку ниже: http://tomasp.net/blog/variance-explained.aspx/