C# 类的实例,该类关闭不可隐式强制转换为泛型接口类型成员的泛型接口

C# 类的实例,该类关闭不可隐式强制转换为泛型接口类型成员的泛型接口,c#,generics,C#,Generics,我在SO和Google上对此进行了很多研究。我的C#应用程序需要能够处理long、decimal和float类型的结果。我一直在探索创建一个通用接口,然后为每个结果类型关闭它的选项 以下是示例代码: using System; interface IResult<T> { T Result(); void Increment(T value); } public class ResultLong : IResult<long> { privat

我在SO和Google上对此进行了很多研究。我的C#应用程序需要能够处理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();
    }
}

在克服学习C#的许多障碍方面,S.O.一直是我的主要指导。这是我的第一个问题,我非常感谢大家的回答。

结果长是
IResult
,而不是
IResult
,因此您会收到错误消息

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

公共类应用程序
{
私有IResult结果;
公开募捐
{
结果=新结果长度();
结果:增量(500);
}
}

App
中,
T
不一定是
长的
。它可以是
十进制
,也可以是
布尔
。解决类似问题的一般方法是从非通用的
IResult
派生
IResult
,并在
App
中使用。或者编写一个具体的
Result
类来实现
IResult
,然后执行
public void Run(){Result=new Result;}
——但前提是两个
T
是相同的
T
;不清楚是否是这样。请检查
Run()
;)的工厂方法设计模式。谢谢你的提示。我会研究你的建议!谢谢,它也可以是十进制或双精度。在这些情况下,我希望通过
result=newresultdecimal()实例化
result=newresultdouble()result.Increment()
,传入相应类型的值。
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;
}
public class App 
{
    private IResult<long> result;

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