Проблема использования generic
От: AlexML Россия  
Дата: 17.08.08 12:14
Оценка:
Есть проблема использования generic класса. Хотелось создать базовый класс для сущностей, имеющий ключ Key. Причем ключ может иметь любой value тип (int, Guid либо составной). Тип object не очень подходит для ключа, т.к. есть проблемы типо-безопастности, boxing и др. Поэтому хотелось бы использовать generic тип для базового класса сущности.

Выглядит это так (все лишнее убрал):
Базовый класс сущности

public abstract class EntityBase<TKey> 
        where TKey : IKey
    {
        private TKey _key;

        public TKey Key
        {
            get { return _key; }
            set
            {
                _key = value;
            }
        }
    }

public interface IKey<T>
    {
        T KeyValue { get; set;}
    }

public interface IKey : IKey<ValueType>
    {
    }

public abstract class Key<T> : IKey
        where T : struct
    {
        private T _keyValue;

        public T KeyValue
        {
            get { return _keyValue; }
            set { _keyValue = value; }
        }


        ValueType IKey<ValueType>.KeyValue
        {
            get { return _keyValue; }
            set { _keyValue = (T)value; }
        }
    }


Классы предметной области:

public class Person : EntityBase<Key<int>>
    {
    }

public class Contract : EntityBase<Key<Guid>>
    {
    }


Проблема возникла, когда появилась необходимость создать коллекцию объектов предметной области.
Т.к. объекты в коллекцию должны попадать различных типов был создан non generic интерфейс IKey.
Но использовать его не получается.


Dictionary<IKey, EntityBase<IKey>> dict = new Dictionary<IKey, EntityBase<IKey>>();
EntityBase<IKey> personEntity = new Person();
dict.Add(personEntity.Key, personEntity);


2-я строка не компилируется «Cannot implicitly convert type 'Person' to 'EntityBase< IKey>'»
Re: Проблема использования generic
От: Аноним  
Дата: 18.08.08 10:35
Оценка:
Здравствуйте, AlexML, Вы писали:

AML>2-я строка не компилируется «Cannot implicitly convert type 'Person' to 'EntityBase< IKey>'»


А почему она должна компилироваться? Слева и справа — выражения совершенно разных, не связанных между собой типов.
Re[2]: Проблема использования generic
От: AlexML Россия  
Дата: 18.08.08 16:02
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, AlexML, Вы писали:


AML>>2-я строка не компилируется «Cannot implicitly convert type 'Person' to 'EntityBase< IKey>'»


А>А почему она должна компилироваться? Слева и справа — выражения совершенно разных, не связанных между собой типов.


А можно объяснить почему слева и справа — выражения совершенно разных, не связанных между собой типов?

class Person : EntityBase<Key<int>>
interface IKey : IKey<ValueType>

вот строка, которая не компилится:
EntityBase<IKey> personEntity = new Person();

То, что они разные это понятно, но что совсем не связаня я бы не сказал.
Re[3]: Проблема использования generic
От: Mab Россия http://shade.msu.ru/~mab
Дата: 18.08.08 16:57
Оценка:
Здравствуйте, AlexML, Вы писали:

AML>То, что они разные это понятно, но что совсем не связаня я бы не сказал.

Читайте про generics covariance.
Re[3]: Проблема использования generic
От: Аноним  
Дата: 18.08.08 19:48
Оценка:
Здравствуйте, AlexML, Вы писали:

AML>вот строка, которая не компилится:

AML>EntityBase<IKey> personEntity = new Person();

AML>То, что они разные это понятно, но что совсем не связаня я бы не сказал.


В C# для типов действует "презумпция виновности", то есть неявное преобразование между любыми двумя типами отсутствует, если спецификацией языка явно не указано обратное. Так что доводы надо приводить Вам.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.