关闭通用接口的类的实例,不能隐式转换为通用接口类型的成员

时间:2016-12-28 20:57:29

标签: c# generics

我在SO和Google上对此进行了相当多的研究。我的C#app需要能够处理long,decimal和float类型的结果。我一直在探索制作通用接口的选项,然后为每种结果类型关闭它。

以下是示例代码:

using System;

interface IResult<T>
{
    T Result();
    void Increment(T value);
}

public class ResultLong : IResult<long>
{
    private long result;

    public long Result()
    {
        return result;
    }

    public void Increment(long value)
    {
        result += value;
    }
}

public class App<T> where T : IConvertible
{
    private IResult<T> result;

    public void Run()
    {
        result = new ResultLong();
    }
}

这给出了错误:

  

无法将类型'ResultLong'隐式转换为'IResult'。存在显式转换(您是否错过了演员?)

添加强制转换修复了编译器错误,但随后Increment方法抛出:

  

无法从int转换为T.

public void Run()
{
    result = (IResult<T>)new ResultLong();
    result.Increment(500);
}

如果这种整体方法有效,请告诉我,如果有效,请告诉我如何使其有效。如果这是一种无效的方法,你会推荐什么?

谢谢! 阿隆

我还应该提一下,这就是我目前正在处理它的方式:

using System;
public class Result
{
    public long ResultLong { get; set; }
    public decimal ResultDecimal { get; set; }
    public double ResultFloat { get; set; }
    public DateTime ResultDateTime { get; set; }

    public void Increment<T>(T value) where T : IConvertible
    {
        if (value is int || value is long)
        {
            ResultLong += value.ToInt64(null);
        }
        else if (value is decimal)
        {
            ResultDecimal += value.ToDecimal(null);
        }
        else if (value is double)
        {
            ResultFloat += value.ToDouble(null);
        }
        else if (value is DateTime)
        {
            ResultDateTime = value.ToDateTime(null);
        }
    }
}

我应该进一步提一下,在查看建议之后,我决定采用基本方法重载,到目前为止,应用似乎工作正常。

public void Increment(int value)
{
    ResultLong += value;
}
public void Increment(long value)
{
    ResultLong += value;
}

public void Increment(double value)
{
    ResultDouble += value;
}

public void Increment(decimal value)
{
    ResultDecimal += value;
}

public void Increment(DateTime value)
{
    ResultDateTime = value;
}

S.O。一直是我学习C#时遇到很多障碍的主要指南。这是我的第一个问题,我非常感谢大家的回答。

1 个答案:

答案 0 :(得分:0)

ResultLong为IResult<long>而非IResult<T>,因此您收到错误消息。

由于您坚持使用long,因此实际上不需要泛型类型语法(因为您已经知道类型是什么)。

public class App 
{
    private IResult<long> result;

    public void Run()
    {
        result = new ResultLong();
        result.Increment(500);
    }
}