Generics 尽管约束了泛型参数,但转换失败

Generics 尽管约束了泛型参数,但转换失败,generics,interface,constraints,Generics,Interface,Constraints,这里我得到了一个小示例,它导致编译器传递类型为的错误: 无法将类型“ProviderValueOne”隐式转换为“ValueProviderType” 在我看来,不可能以任何方式违反类型,那么为什么不接受此代码呢 启蒙运动受到赞赏 public interface IProvideValue { int Value { get; } } public class ProvideValueOne : IProvideValue { public int Value {

这里我得到了一个小示例,它导致编译器传递类型为的错误:

无法将类型“ProviderValueOne”隐式转换为“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
        }
    }
}
公共接口IProvideValue
{
int值{get;}
}
公共类ProvideValueOne:IProvideValue
{
公共整数值
{
获取{return 1;}
}
}
公共类providevalue二:iprovevalue
{
公共整数值
{
获取{return 2;}
}
}
其中ValueProviderType:IProviderValue的公共类BaseEntity
{
公共价值提供者类型提供者
{
得到{
返回新的ProviderValueOne();//未编译
}
}
}
在我看来,不可能以任何方式违反这些类型

哦,但它是:

var x = new BaseEntity<ProviderValueTwo>();
ProviderValueTwo y = x.Provider;
var x=new BaseEntity();
ProviderValueTwo y=x。提供程序;
所以C#标记这一点是正确的。你可能是指以下的意思吗

public class BaseEntity<ValueProviderType>
    where ValueProviderType : IProvideValue, new()
{
    public ValueProviderType Provider
    {
        get{
            return new ValueProviderType();
        }
    }
}
公共类基本实体
其中ValueProviderType:IProvideValue,new()
{
公共价值提供者类型提供者
{
得到{
返回新的值ProviderType();
}
}
}
请注意添加的
new
约束

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

哦,但它是:

var x = new BaseEntity<ProviderValueTwo>();
ProviderValueTwo y = x.Provider;
var x=new BaseEntity();
ProviderValueTwo y=x。提供程序;
所以C#标记这一点是正确的。你可能是指以下的意思吗

public class BaseEntity<ValueProviderType>
    where ValueProviderType : IProvideValue, new()
{
    public ValueProviderType Provider
    {
        get{
            return new ValueProviderType();
        }
    }
}
公共类基本实体
其中ValueProviderType:IProvideValue,new()
{
公共价值提供者类型提供者
{
得到{
返回新的值ProviderType();
}
}
}

请注意添加的
新约束。

BaseEntity类只希望ValueProviderType实现IProvideValue。它不知道这是什么课。。。如果它是一个类(可能是一个结构??)

如果添加“new()”约束并实例化“ValueProviderType”的实例会怎么样

    public class BaseEntity<ValueProviderType> where ValueProviderType : IProvideValue,new()
{
    public ValueProviderType Provider
    {
        get{
            return new ValueProviderType(); // doesnt´t compile
        }
    }
}
公共类BaseEntity,其中ValueProviderType:IProvideValue,new()
{
公共价值提供者类型提供者
{
得到{
返回新的ValueProviderType();//未编译
}
}
}

BaseEntity类只希望ValueProviderType实现IProvideValue。它不知道这是什么课。。。如果它是一个类(可能是一个结构??)

如果添加“new()”约束并实例化“ValueProviderType”的实例会怎么样

    public class BaseEntity<ValueProviderType> where ValueProviderType : IProvideValue,new()
{
    public ValueProviderType Provider
    {
        get{
            return new ValueProviderType(); // doesnt´t compile
        }
    }
}
公共类BaseEntity,其中ValueProviderType:IProvideValue,new()
{
公共价值提供者类型提供者
{
得到{
返回新的ValueProviderType();//未编译
}
}
}

+1:我要添加的唯一其他点是泛型类型参数的命名约定。+1:我要添加的唯一其他点是泛型类型参数的命名约定。