C# 在基类中将属性作为泛型并尝试在派生类中重写时获取类型不匹配错误

C# 在基类中将属性作为泛型并尝试在派生类中重写时获取类型不匹配错误,c#,generics,C#,Generics,我有一个基类,如下所示,用于计算两种不同类型的统计信息: public abstract class BaseStatsCalculator<T> { public abstract T First { get; } public abstract T Second { get; } public abstract T ValueDiff { get; protected set; } public abstra

我有一个基类,如下所示,用于计算两种不同类型的统计信息:

public abstract class BaseStatsCalculator<T>
    {
        public abstract T First { get; }
        public abstract T Second { get; }
        public abstract T ValueDiff { get; protected set; }
        public abstract T MatchingPercentage { get;}
    }
我在计算MatchingPercentage属性时遇到问题,因为它将根据公式计算,并且舍入将基于用户选择的小数位数配置。

public class Type1 : BaseStatsCalculator<int>
    {
        public override double MatchingPercentage
        {
            get {
                double a = (Second - ValueDiff) * 100;
                double b = Second;
                double matchingPercentage = 00.00;
                if (b > 0)
                    matchingPercentage = Math.Round(((double)a / b), this._decimalPlaces);
            }
        }
   }
公共类类型1:BaseStatsCalculator
{
公共覆盖双匹配百分比
{
得到{
双a=(第二个-值差)*100;
双b=秒;
双匹配百分比=00.00;
如果(b>0)
匹配百分比=数学四舍五入(((双)a/b),此为小数位数);
}
}
}
类型2使用以下公式计算匹配百分比:

public class Type1 : BaseStatsCalculator<Decimal>
    {
       public override decimal MatchingPercentage
        {
            get {
                decimal matchPer = 0;
                if (Second > 0 || First > 0)
                matchPer = ((Math.Min(Second,First) / Math.Max(Second,First)) * 100);
                return (TruncateDecimal(matchPer, this.decimalPlaces))
            }
        }

        public decimal TruncateDecimal(decimal value, int precision)
        {
            decimal step = (decimal)Math.Pow(10, precision);
            decimal tmp = Math.Truncate(step * value);
            return tmp / step;
        }
}
公共类类型1:BaseStatsCalculator
{
公共覆盖十进制匹配百分比
{
得到{
十进制匹配器=0;
如果(第二个>0 | |第一个>0)
matchPer=((Math.Min(第二,第一)/Math.Max(第二,第一))*100);
return(TruncateDecimal(matchPer,this.decimalPlaces))
}
}
公共十进制截断CIMAL(十进制值,整数精度)
{
十进制步长=(十进制)数学功率(10,精度);
十进制tmp=数学截断(步长*值);
返回tmp/step;
}
}
所以对于类型2,我想我不会有问题,但对于类型1,我在这里面临的问题是:

公共覆盖双匹配百分比 { }

错误:
它应该与int一起工作


有人能告诉我如何解决这个问题吗?

当您重写某个成员的类型时,您不能更改它。属性
MatchingPercentage
应该与
BaseStatsCalculator
中指定的类型相同(即
int
)。如果您的泛型参数是
int
,那么您的方法
MatchingPercentage
肯定会返回
int
,而不是
double
,不应该吗?您的设计依赖于一个假设,即差异和百分比与值的类型相同,但情况并非总是如此(如果
t
is
uint
,差异也可能是错误的)。您可以为这些类型添加一个额外的类型参数,或者考虑它们将始终是给定类型。问题仍然是:<代码>匹配百分比< /代码>泛型,如果您总是期望它返回小数?不要将数据与表示混合。小数点是您希望在GUI中显示的内容(表示)。但是,数字(即数据)上不存在此点。所以你的方法根本不应该关心小数点。但是,您的GUI应该是。
public class Type1 : BaseStatsCalculator<Decimal>
    {
       public override decimal MatchingPercentage
        {
            get {
                decimal matchPer = 0;
                if (Second > 0 || First > 0)
                matchPer = ((Math.Min(Second,First) / Math.Max(Second,First)) * 100);
                return (TruncateDecimal(matchPer, this.decimalPlaces))
            }
        }

        public decimal TruncateDecimal(decimal value, int precision)
        {
            decimal step = (decimal)Math.Pow(10, precision);
            decimal tmp = Math.Truncate(step * value);
            return tmp / step;
        }
}