Похоже, что вы хотите, чтобы DClass
был псевдонимом для BClass<int>
. Но это не то, что у вас здесь. То, что у вас есть, это то, что DClass
происходит от BClass<int>
. Таким образом, при вызове DClass.Create();
создается BClass<int>
, который не a DClass
(это наоборот).
Это может прояснить ситуацию. Предположим, у вас была эта иерархия:
class Rectangle {
static Rectangle Create() {
return new Rectangle();
}
}
class Square : Rectangle { }
// code elsewhere
var shape = Square.Create(); // you might want this to return a square,
// but it's just going to return a rectangle
Один из способов получить что-то похожее на желаемую функциональность может состоять в определении вашего Create
метода следующим образом:
static TClass Create<TClass>() where TClass : BClass<T>, new() {
return new TClass();
}
// code elsewhere
var shape = DClass.Create<DClass>();
Это немного грязно, хотя (и также требует, чтобы вы написали конструктор без параметров для DClass
). Если вы не можете использовать метод Create
для создания экземпляров ваших объектов, подумайте о написании фабричного класса для него.