В чем причина этой ошибки (наследование класса с универсальным)? - PullRequest
0 голосов
/ 30 сентября 2019

Снимок экрана ошибки Я создаю пакет универсальных классов, постепенно определяя универсальный тип от T до example_of_stored_class .

public class ModifiedList<example_of_stored_class> : AdvancedList<example_of_stored_class> 
{
    public void someMethod ()
    {
    }
}

public class AdvancedList<T> : List<T> where T : example_of_stored_class
{
    public AdvancedList ()
        {

        }
}
public class example_of_stored_class
{
    public string s = "Hi, i'm an example_of_stored_class!";
}

Сообщение об ошибке:

Тип 'example_of_stored_class' нельзя использовать в качестве параметра типа 'T' в универсальном типе или методе 'AdvancedList'. Здесь нет преобразования или преобразования параметров типа «example_of_stored_class» в «R7_app .example_of_stored_class».

Вопрос в том, в чем разница между «example_of_stored_class» и «R7_app». example_of_stored_class? Почему это происходит?

Ответы [ 4 ]

4 голосов
/ 30 сентября 2019

Это было так:

public class ModifiedList : AdvancedList<example_of_stored_class>
{
    public void someMethod()
    {
    }
}

Произошла ошибка в объявлении ModifiedList. Мне не нужно было объявлять example_of_stored_class дважды. Спасибо, Эд Планкетт!

3 голосов
/ 30 сентября 2019

Первое появление example_of_stored_class здесь - это параметр типа , поскольку он отображается в угловых скобках после имени класса в определении класса: по правилам C # вы говорите, что ModifiedClass принимает параметр типа с именем example_of_stored_class. Кто-то, использующий ваш класс, может предоставить любой фактический тип для этого параметра (по крайней мере, если все скомпилировано для начала):

var x = new ModifiedList<int>();
var y = new ModifiedList<String>();

Но тогда вы наследуете этот универсальный класс от другого универсального класса, где вы поставьте example_of_stored_class в качестве значения параметра типа AdvancedList. Здесь мы не определяем AdvancedList, поэтому тип в угловых скобках интерпретируется как тип, который вы хотите использовать для параметра типа.

Вы нашли способ заставить example_of_stored_class означать две разные вещи в одной строке, и возникла путаница.

public class ModifiedList<example_of_stored_class> 
    : AdvancedList<example_of_stored_class>

Это скомпилирует:

public class ModifiedList<T> : AdvancedList<example_of_stored_class>
{
    public void someMethod()
    {
    }
}

Но я подозреваю, что вы действительно хотите, чтобы ModifiedList<T> наследовал от AdvancedList<T> с параметром типа с тем же :

public class ModifiedList<MyT> : AdvancedList<MyT>
{
    public void someMethod()
    {
    }
}

Или это - вы хотите, чтобы example_of_stored_class был единственным параметром типа на рисунке. В этом случае ModifiedList не является универсальным. Он наследуется от «реализованного» универсального класса, класса, в котором уже есть параметр типа.

public class ModifiedList : AdvancedList<example_of_stored_class>
{
    public void someMethod()
    {
    }
}
1 голос
/ 30 сентября 2019

Вы не можете написать:

ModifiedList<example_of_stored_class> : AdvancedList<example_of_stored_class>

Поскольку в первой части оператора вы должны указать общий параметр, который используется для «замены».

Как и он не может быть типом.

Вы должны написать:

ModifiedList<T> : AdvancedList<example_of_stored_class>

Где T не тип, определенный в коде как класс, потому что этоАртефакт шаблона.

Слово «шаблон» здесь относится к шаблонам C ++, даже универсальные шаблоны C # не совпадают с шаблонами C ++, но исторически универсальные шаблоны происходят из шаблонов.

Параметры универсального типа (Руководство по программированию в C #)

Вы просто хотели написать:

ModifiedList : AdvancedList<example_of_stored_class>
0 голосов
/ 30 сентября 2019

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

public abstract class Middle<T> : A<T> where T : ALayer
{
    public int middleAttr { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...