c# - 与泛型的反/协方差 - 不能分配给 T

标签 c# generics covariance contravariance

代码:

public interface IAssignable
{
    IAssignable AssignMe { get; set; }
}

public class GenericAssignExample<T> where T : IAssignable
{
    private T _assignable;

    public void Valid(T toAssign)
    {
        _assignable.AssignMe = toAssign;
    }

    public void AlsoValid(T toAssign)
    {
        _assignable.AssignMe = toAssign.AssignMe;
    }

    public void AlsoValidAsWell(T toAssign)
    {
        _assignable = toAssign;
    }

    public void Invalid(T toAssign)
    {
        _assignable = toAssign.AssignMe;
    }
}

问题:

在最后一个示例方法 _assignable(它是 T,其中 T 是 IAssignable)不能被分配值 toAssign.AssignMe(这是输入 IAssignable), 编译器抛出

"Cannot implicitly convert type 'IAssignable' to 'T'".

这是为什么? TIAssignable 那么确定 IAssignable 的实例可以分配给它吗?

最佳答案

Why is this? T is IAssignable so surely an instance of IAssignable can be assigned to it?

啊,不是吗? T 不是 IAssignable,如果是,您就不需要泛型。 T 只是实现 IAssignable

仅仅因为 ButtonTextBox 继承自 Control(或者在虚构的示例中实现 IControl)不会意味着您可以将 TextBox 分配给 Button,反之亦然。


public interface IAssignable
{
    IAssignable AssignMe { get; set; }
}

public class A : IAssignable
{
    public IAssignable AssignMe { get; set; }
}

public class B : IAssignable
{
    public IAssignable AssignMe { get; set; }
}

// You will be able to instantiate this class with either A or B and both must be valid
public class GenericAssignExample<T> where T : IAssignable
{
    // here, T refers to either A or B.
    private T _assignable;

    public void Valid(T toAssign)
    {
        // assigning either an A or B to the interface... 
        // always valid, both implement it
        _assignable.AssignMe = toAssign;
    }

    public void AlsoValid(T toAssign)
    {
        // assigns interface to interface. Always valid.
        _assignable.AssignMe = toAssign.AssignMe;
    }

    public void AlsoValidAsWell(T toAssign)
    {
        // assigns either an A to an A
        // or a B to a B.
        // both always valid.
        _assignable = toAssign;
    }

    public void Invalid(T toAssign)
    {
        // this tries to assign an interface to either an A or a B
        // always invalid.
        _assignable = toAssign.AssignMe;
    }
}

关于c# - 与泛型的反/协方差 - 不能分配给 T,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43978711/

相关文章:

c# - 泛型类型参数和 Nullable 方法重载

泛型:抽象类和子类型

c# - 将 C# 类数组作为结构数组编码到 C

c# - Kendo grid更新数据失败,总是创建数据

generics - 使用宏编写 const 泛型枚举组合

c# - ILookup<TKey, TElement> 不应该在 TElement 中(声明)协变吗?

C# 集合类型约束泛型

c# - 推送通知错误 - 缺少注册

c# - Css 类没有在后面的代码中被删除

generics - 通用密封类的类型安全使用