尽管通用参数受到约束,但转换失败

时间:2011-01-10 21:59:16

标签: generics interface constraints

这里我得到一个小例子,它会导致编译器传递类型错误:

“无法将类型'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 个答案:

答案 0 :(得分:1)

  

在我看来,不可能以任何方式违反类型

哦,但它是:

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约束。

答案 1 :(得分:0)

BaseEntity类只期望ValueProviderType实现IProvideValue。它不知道它是什么类...如果它甚至是一个类(也许它是一个结构??)。

如果添加'new()'约束并实例化'ValueProviderType'实例怎么办?

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