[英]Covariance issue in C#
我有這樣的類聲明:
internal private abstract class BoxGroup<TS> : IBoxGroup where TS : SavedState
在那個班級我有這個方法:
protected virtual TS saveState() {
return new SavedState(Width, Height);
}
我認為這是正確的,但我在return語句下看到紅線,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;
}
}
這與協方差無關; 這是不可能的。
由於TS
可以是任何擴展SavedState
類, SavedState
您無法將基本SavedState
實例神奇地轉換為TS
。
例如,如果我創建一個BoxGroup<MySpecialSavedState>
,您的代碼將嘗試將基本SavedState
對象轉換為MySpecialSavedState
,這是不可能的。
這是一個小程序,展示了嘗試實現您想要的一種潛在方式:
using System;
namespace Test
{
class SaveState
{
public int Width { get; set; }
public int Height { get; set; }
}
class SaveStateWithPi : SaveState
{
public double Pi
{
get { return Math.PI; }
}
}
class Program
{
public static T CreateSavedState<T>(int width, int height)
where T : SaveState, new()
{
return new T
{
Width = width,
Height = height
};
}
static void Main(string[] args)
{
SaveState state = CreateSavedState<SaveStateWithPi>(5, 10);
Console.WriteLine("Width: {0}, Height: {1}", state.Width, state.Height);
}
}
}
基本上,我們的想法是使用new()約束(因此從SaveState派生的所有類型都必須具有默認構造函數)和對象初始值設定項。 當然這意味着你的SaveState類不能再擁有私有的setter了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.