Странная ошибка компиляции дженериков

У меня есть два класса, базовый класс и дочерний класс. В базовом классе я определяю универсальный виртуальный метод:

protected virtual ReturnType Create<T>() where T : ReturnType {}

Затем в моем дочернем классе я пытаюсь сделать это:

protected override ReturnTypeChild Create<T>() // ReturnTypeChild inherits ReturnType
{ 
  return base.Create<T> as ReturnTypeChild; 
}

Visual Studio дает эту странную ошибку:

The type 'T' cannot be used as type parameter 'T' in the generic type or method 'Create()'. There is no boxing conversion or type parameter conversion from 'T' to 'ReturnType'.

Повторение, где пункт на переопределении ребенка также дает ошибку:

Constraints for override and explicit interface implementation methods are inherited from the base method, so they cannot be specified directly

Таким образом, что я делаю неправильно здесь?

5
задан Jouke van der Maas 7 June 2010 в 00:07
поделиться

2 ответа

Это работает. Вы должны были сделать тип возвращаемого значения универсальным:

public class BaseClass {
  public virtual T Create<T>() where T : BaseClass, new()  {
   var newClass = new T();
   //initialize newClass by setting properties etc
   return newClass;
  }
 }

 public class DerivedClass : BaseClass {
  public override T Create<T>() {
   var newClass =  base.Create<T>();
   //initialize newClass with DerivedClass specific stuff
   return newClass;
  }
 }

void Test() {

 DerivedClass d = new DerivedClass() ;
 d.Create<DerivedClass>();
}

Вот некоторые основные правила переопределения C # :

Переопределенный базовый метод должен иметь та же подпись, что и переопределение метод.

Это означает тот же возвращаемый тип и те же аргументы метода.

3
ответ дан 14 December 2019 в 19:01
поделиться

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

2
ответ дан 14 December 2019 в 19:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: