Возникли проблемы с наследованием и обобщениями в C # - PullRequest
2 голосов
/ 10 ноября 2011

У меня есть класс, и я объявляю его так:

public class WhereOrCondition<T> : WhereCondition<T>

Универсальный тип T одинаков для обоих классов.Я не уверен, как правильно объявить свои классы, чтобы общий тип, используемый для WhereOrCondition, также использовался в WhereCondition.

. Объявление моего класса таким образом приводит к следующей ошибке:

Error 1 The type 'T' cannot be used as type parameter 'T' in the generic type or method 'BrainStorm.WhereCondition<T>'. There is no boxing conversion or type parameter conversion from 'T' to 'BrainStorm.DatabaseObject'.

Есть идеи, как правильно объявить свой класс?

РЕДАКТИРОВАТЬ

Класс WhereCondition объявлен так:

public class WhereCondition<T> : IEnumerable<KeyValuePair<string, object>> where T : DatabaseObject 

Ответы [ 3 ]

7 голосов
/ 10 ноября 2011

Вам нужно поставить то же самое условие для WhereOrCondition<T>, чтобы оно выглядело как

public class WhereOrCondition<T> : WhereCondition<T> where T: DatabaseObject

Правило: предложение where для подкласса должно быть таким же или более ограничительным, как предложение where в базовом классе.

Это означает, что WhereOrCondition<T> имеет WhereCondition<T> для подкласса, а T должно быть DatabaseObject (или подклассом).

Ваш код в комментарии public class WhereAndCondition<T> where T: WhereCondition<T> - это нечто совершенно иное. Это говорит о том, что T должно быть WhereCondition<T>, что не может быть правдой.

1 голос
/ 10 ноября 2011

У вас недостаточно кода, чтобы кто-то действительно мог определить, чего вы пытаетесь достичь.Позвольте мне проиллюстрировать.

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

public class WhereCondition<T>
{
}

public class WhereOrCondition<T> : WhereCondition<T>
{
}

public class DatabaseObject
{
    public int Id { get; set; }
}

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

Единственное, о чем я могу подумать, это может вызвать проблемы, если вы на самом деле не держите вещи «универсальными» и набрали T в одном из классов,добавление "where T: objectType".

Я что-то упустил?

1 голос
/ 10 ноября 2011

Добавление кода для ответа Рэя:

public class WhereOrCondition<T> : WhereCondition<T> where T : DatabaseObject { }

public class WhereCondition<T> : IEnumerable<KeyValuePair<string, object>> where T : DatabaseObject
{
    public IEnumerator<KeyValuePair<string, object>> GetEnumerator() { }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

public class DatabaseObject { }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...