У меня есть универсальный c интерфейс, содержащий ковариантный параметр TValue и абстрактный класс, который выполняет некоторые повторяющиеся действия, чтобы освободить дочерние классы от этого бремени. Затем у меня есть 2 подкласса, которые расширяются от этого абстрактного, первый задает параметр generi c как строку, а второй - как int.
Это часть кода, взятая из проекта, чрезмерно упрощенная просто чтобы сосредоточиться на этом вопросе.
public interface IElement<out TValue>
{
string Name { get; }
TValue Value { get; }
}
public abstract class Element<TValue> : IElement<TValue>
{
public string Name { get; }
public TValue Value { get; set; }
public Element(string name)
{
Name = name;
}
}
public class Name : Element<string>
{
public Name() : base("Name") { }
}
public class Height : Element<int>
{
public Height() : base("Height") { }
}
В основном - и это не то, что я делаю в своем коде, но довольно просто иллюстрирует проблему, с которой я сталкиваюсь - если я пытаюсь назначить Имя для Элемент IElement, удерживающий объект, подобный следующему:
IElement<object> element = new Name();
Это успешно, как я и ожидал, поскольку параметр TValue в IElement является ковариантным. Однако, если я установлю его на Height:
IElement<object> element = new Height();
, я получу ошибку Cannot implicitly convert type 'Height' to 'IElement<object>'. An explicit conversion exists (are you missing a cast?)
.
Теперь я не знаю, почему это работает с классом, который устанавливает generi c параметр в виде строки, но не с целым числом (или перечислением, как у меня также есть в проекте некоторые перечисления). Это потому, что string - это класс, а int - это структура?
Любая помощь приветствуется.