2016-12-28 83 views
2

我对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(); 
    } 
} 

这给出了错误:

Cannot implicitly convert type 'ResultLong' to 'IResult'. An explicit conversion exists (are you missing a cast?)

添加铸造修复编译器错误,但随后的增量方法抛出:

Cannot convert from int to 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#时克服许多障碍的主要指南。这是我的第一个问题,我非常感谢大家的回应。

+3

在'App '中,'T'不一定是'long'。它可以很容易地是“小数”或“布尔”。攻击类似问题的一般方法(从未很好,可能在您的具体情况下不可用)将从非泛型'IResult'派生'IResult ',并在'App '中使用。或者写一个具体的'Result '类实现'IResult ',然后做'public void Run(){result = new Result ; }' - 但只有当两个'T'都是相同'T';不清楚是否如此。 –

+0

请检查'Run()';)的工厂方法设计模式。 –

+0

感谢您的提示。我会研究你的建议! – Aron

回答

0

ResultLong是IResult<long>而不是IResult<T>,所以您会收到错误消息。

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

public class App 
{ 
    private IResult<long> result; 

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

谢谢,它也可能是十进制或双精度。在这些情况下,我想通过'result = new ResultDecimal();'或'result = new ResultDouble();'实例化,然后调用'result.Increment()',传入相应类型的值。 – Aron

相关问题