Преобразование не удается, хотя общие параметры ограничены - PullRequest
1 голос
/ 11 января 2011

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

"Невозможно неявно преобразовать тип 'ProvideValueOne' в 'ValueProviderType'".

По моему мнению, этоневозможно каким-либо образом нарушать типы, так почему этот код не принят?

Просветление приветствуется.

public interface IProvideValue
{
    int Value { get; }
}

public class ProvideValueOne : IProvideValue
{
    public int Value
    {
        get { return 1; }
    }
}

public class ProvideValueTwo : IProvideValue
{
    public int Value
    {
        get { return 2; }
    }
}

public class BaseEntity<ValueProviderType> where ValueProviderType : IProvideValue
{
    public ValueProviderType Provider
    {
        get{
            return new ProvideValueOne(); // doesnt´t compile
        }
    }
}

Ответы [ 2 ]

1 голос
/ 11 января 2011

На мой взгляд, невозможно каким-либо образом нарушать типы

Да, но это:

var x = new BaseEntity<ProviderValueTwo>();
ProviderValueTwo y = x.Provider;

Так что C # правильно пометить это,Возможно, вы имели в виду следующее?

public class BaseEntity<ValueProviderType>
    where ValueProviderType : IProvideValue, new()
{
    public ValueProviderType Provider
    {
        get{
            return new ValueProviderType();
        }
    }
}

Обратите внимание на добавленное ограничение new.

0 голосов
/ 11 января 2011

Класс BaseEntity ожидает, что ValueProviderType только реализует IProvideValue.Он понятия не имеет, что это за класс ... если это даже класс (может быть, это структура ??).

Что если вы добавите ограничение 'new ()' и создадите экземпляр экземпляра ValueProviderType'?

    public class BaseEntity<ValueProviderType> where ValueProviderType : IProvideValue,new()
{
    public ValueProviderType Provider
    {
        get{
            return new ValueProviderType(); // doesnt´t compile
        }
    }
}
...