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)
这与协方差无关; 这是不可能的.
因为TS可以是任何扩展的类SavedState,所以你不能将基本SavedState实例神奇地转换为任何类TS.
例如,如果我创建一个BoxGroup<MySpecialSavedState>,您的代码将尝试将基础SavedState对象转换为a MySpecialSavedState,这是不可能的.