我已经在 SO 和 Google 上对此进行了大量研究。我的 C# 应用程序需要能够处理 long、decimal 和 float 类型的结果。我一直在探索制作通用接口(interface)的选项,然后为每种结果类型关闭它。
示例代码如下:
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?)
添加强制转换修复了编译器错误,但随后 Increment 方法抛出:
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# 的许多障碍的主要指南。这是我的第一个问题,非常感谢大家的回答。
ResultLong 是 IResult<long>
而不是 IResult<T>
,所以您会收到错误消息。
既然你坚持要用long
,确实不需要泛型类型语法(因为您已经知道类型是什么)。
public class App
{
private IResult<long> result;
public void Run()
{
result = new ResultLong();
result.Increment(500);
}
}
我是一名优秀的程序员,十分优秀!