1

我是使用泛型的新手。

我的函数 GetValuesGenerics 给了我一些错误:

无法将类型“ ImproveMe.ViewModel.ControlYourWeight.DateTimeValuesGenerics”隐式转换为“ ImproveMe.ViewModel.ControlYourWeight.ValuesGenerics<T>

我的目标是我给出一个最小值和最大值,它会在最小值和最大值之间生成一个值范围。我也想使用泛型从其他类调用生成器。我真的不知道我是否有双重或日期时间!

你能帮帮我吗?

public static class ValuesGenericsGenerator<T>
{
    public static ValuesGenerics<T> GetValuesGenerics()
    {
        if (typeof(T) == typeof(double))
        {
            return new DoubleValuesGenerics(1,1); ;
        }
        else if (typeof(T) == typeof(DateTime))
        {
            return new DateTimeValuesGenerics(DateTime.Now, DateTime.Now.AddDays(5));
        }
        else
        {
            return null;
        }
    }
}

public abstract class ValuesGenerics<T> 
{
    protected T minValue;

    protected T maxValue;

    public ValuesGenerics(T minValue, T maxValue)
    {
        this.minValue = minValue;
        this.maxValue = maxValue;
    }

    public abstract List<T> GenerateValues();
}

public class DoubleValuesGenerics : ValuesGenerics<double>
{
    public DoubleValuesGenerics(double minValue, double maxValue)
        : base(minValue, maxValue)
    {
    }

    public override List<double> GenerateValues()
    {
        List<double> values = new List<double>();
        do
        {
            values.Add(minValue);
            minValue++;
        }
        while (minValue <= maxValue);
        return values;
    }
}

public class DateTimeValuesGenerics : ValuesGenerics<DateTime>
{
    public DateTimeValuesGenerics(DateTime minValue, DateTime maxValue)
        : base(minValue, maxValue)
    {
    }

    public override List<DateTime> GenerateValues()
    {
        List<DateTime> values = new List<DateTime>();
        do
        {
            values.Add(minValue);
            minValue.AddDays(1);
        }
        while (minValue <= maxValue);
        return values;
    }
}
4

2 回答 2

1

您可以通过首先将结果转换为GetValuesGenerics()您的通用、非泛型基类ValuesGenericsGenerator<T>(例如对象,对于所有 c# 对象)来做到这一点。

public static class ValuesGenericsGenerator<T>
{
    public static ValuesGenerics<T> GetValuesGenerics()
    {
        object result;

        if (typeof(T) == typeof(double))
        {
            result = new DoubleValuesGenerics(1,1);
        }
        else if (typeof(T) == typeof(DateTime))
        {
            result = new DateTimeValuesGenerics(DateTime.Now, DateTime.Now.AddDays(5));
        }
        else
        {
            return null;
        }

        return (ValuesGenerics<T>) result;
    }
}

注意:您当前的代码只允许您调用一次GenerateValues()并在使用该版本时产生无限循环DateTime!你应该把它改成

public override List<double> GenerateValues()
{
    List<double> values = new List<double>();
    double val = minValue;
    do
    {
        values.Add(val);
        val++;
    }
    while (val <= maxValue);
    return values;
}

...

public override List<DateTime> GenerateValues()
{
    List<DateTime> values = new List<DateTime>();
    DateTime val = minValue;
    do
    {
        values.Add(val);
        val = val.AddDays(1);
    }
    while (minValue <= maxValue);
    return values;
}
于 2020-10-28T14:18:23.397 回答
0

您需要明确告诉编译器您期望的返回类型,否则它无法确定返回类型,如果它是 ValuesGenerics 或 ValuesGenerics 或其他东西。

不确定确切的符号,但应该是这样的:

public static class ValuesGenericsGenerator<T, TValues> where TValues : ValuesGenerics<T>
{
    public static TValues GetValuesGenerics()
    {
        // Do something.
    }
}
于 2020-10-28T14:16:37.153 回答