我有一个如下定义的通用接口(IAmMeasurable
)。我有一个该接口的实现(Sales
)。我正在尝试创建一个泛型类(Fact
),以便我可以这样实例化它:
var todaySales = new Fact<Sales>();
不幸的是,我被迫做以下事情:
var todaySales = new Fact<Sales, decimal>();
由于Sales
被定义为IAmMeasurable<decimal>
,这似乎很尴尬。使用decimal
Sales
public interface IAmMeasurable<TValue> where TValue : struct
{
}
public class Sales : IAmMeasurable<decimal>
{
}
public class Fact<TMeasure, TValue>
where TMeasure : IAmMeasurable<TValue>
where TValue : struct
{
public TValue Observed { get; set; }
}
也许这只是语言的限制?或者是否有另一种方法来构建这个以实现我的目标?或者我只是没有正确地思考问题?
在我看来,有些东西是可衡量的,它们是以特定类型衡量的(销售额以美元计算,用十进制表示)。事实是观察一些措施。我观察到今天销售额是100美元(100米)。
答案 0 :(得分:0)
如果你想避免这种情况,你只需要设计一个TValue
Fact
为小数的中间类:
public class DecimalFact<TMeasure> : Fact<TMeasure, decimal>
where TMeasure : IAmMeasurable<decimal>
{
}
即使在第6版中,C#也没有像方法中那样的泛型类型参数推断。顺便说一句,通用类型参数很难被使用。 C#编译器如何知道IAmMeasurable<T>
T
泛型参数是TValue
?也许像TValue is TMeasure
这样的新通用约束?谁知道;)
上述解决方案似乎是最佳解决方案,它是通过设计具体化通用参数的最常用解决方案。