C#中的协方差问题

Ras*_*sto 2 c# generics covariance contravariance

我有这样的类声明:

internal private abstract class BoxGroup<TS> : IBoxGroup where TS : SavedState
Run Code Online (Sandbox Code Playgroud)

在那个班级我有这个方法:

protected virtual TS saveState() {
    return new SavedState(Width, Height);
}
Run Code Online (Sandbox Code Playgroud)

我认为这是正确的,但我在返回语句下看到红线,Resharper说new SavedState(Width, Height)无法转换为TS.我不知道为什么.我认为这TS可以是任何扩展的类,SavedState但也可以SavedState.我该怎么做才能纠正它?

类保存状态非常简单,如下所示:

private class SavedState {
    internal float Width { get; private set; }
    internal float Height { get; private set; }
    public SavedState(float width, float height) {
        Width = width;
        Height = height;
    }
}
Run Code Online (Sandbox Code Playgroud)

SLa*_*aks 6

这与协方差无关; 这是不可能的.

因为TS可以是任何扩展的类SavedState,所以你不能将基本SavedState实例神奇地转换为任何类TS.

例如,如果我创建一个BoxGroup<MySpecialSavedState>,您的代码将尝试将基础SavedState对象转换为a MySpecialSavedState,这是不可能的.