簡體   English   中英

C#中的協方差問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM