泛型兼容性

问题描述 投票:0回答:1

我知道这通常可以追溯到方差,但我不确定如何解决下面显示的问题。 我想要一个通用传感器列表,并将特定传感器类型添加到列表中,但这会产生编译器错误,基本上说明类型 TemHumSensorSensor

不兼容

namespace ConsoleApp3
{
    abstract class Measurement
    {
        public double Value { get; set; } = 0;
    }

    class TempHumMeasurement : Measurement 
    { 
        public double Temp { get; set; }
        public double Hum { get; set; }
        public TempHumMeasurement(double t, double h) 
        { 
            Value = t;
            Temp = t;
            Hum = h;
        }
    }

    abstract class Sensor<T> where T : Measurement
    {
        public List<T> Measurements = new();
    }

    class TempHumSensor : Sensor<TempHumMeasurement>
    {
        public TempHumSensor() { }
    }

    internal class Program
    {
        static void Main(string[] args)
        {
            var sensors = new List<Sensor<Measurement>>();
            var ths = new TempHumSensor();
            sensors.Add(ths);
        }
    }

}

问题出在最后一行代码:

compiler error message

为什么会这样,如何正确表达?

c# generics covariance variance contravariance
1个回答
0
投票

我希望这种方法对你有帮助:

using System;
using System.Collections;
using System.Collections.Generic;
                

namespace ConsoleApp3
{
   interface IMeasurement
    {
    double Value{get;set;}
    }

abstract class Measurement
{
    public double Value { get; set; } = 0;
}

class TempHumMeasurement : Measurement, IMeasurement 
{ 
    public double Temp { get; set; }
    public double Hum { get; set; }
    public TempHumMeasurement(double t, double h) 
    { 
        Value = t;
        Temp = t;
        Hum = h;
    }
}

abstract class Sensor<T> where T : IMeasurement
{
    public List<T> Measurements = new();
}

class TempHumSensor : Sensor<IMeasurement>
{
    public TempHumSensor() { }
}

internal class Program
{
    static void Main(string[] args)
    {
        var sensors = new List<Sensor<IMeasurement>>();
        var ths = new TempHumSensor();
        sensors.Add(ths);           
    } 
 }
}
© www.soinside.com 2019 - 2024. All rights reserved.