C# 如何在实例化泛型类时避免指定冗余类型
我有一个定义如下的通用接口(C# 如何在实例化泛型类时避免指定冗余类型,c#,.net,generics,c#-4.0,interface,C#,.net,Generics,C# 4.0,Interface,我有一个定义如下的通用接口(iammable)。我有一个接口的实现(Sales)。我正在尝试创建一个泛型类(Fact),以便像这样实例化它: var todaySales = new Fact<Sales>(); 也许这只是语言的局限?或者有没有其他的方法来构建这个框架来实现我的目标?或者我只是没有正确地思考这个问题 在我看来,有些东西是可以衡量的,它们是以特定的类型来衡量的(销售额是以美元来衡量的,用十进制表示)。事实是某种程度上的观察。我发现今天的销售额是100美元(1亿美元)
iammable
)。我有一个接口的实现(Sales
)。我正在尝试创建一个泛型类(Fact
),以便像这样实例化它:
var todaySales = new Fact<Sales>();
也许这只是语言的局限?或者有没有其他的方法来构建这个框架来实现我的目标?或者我只是没有正确地思考这个问题
在我看来,有些东西是可以衡量的,它们是以特定的类型来衡量的(销售额是以美元来衡量的,用十进制表示)。事实是某种程度上的观察。我发现今天的销售额是100美元(1亿美元)。如果你想避免这种情况,你只需要设计一个中间类,其中
事实的值是十进制的:
public class DecimalFact<TMeasure> : Fact<TMeasure, decimal>
where TMeasure : IAmMeasurable<decimal>
{
}
公共类判定错误:事实
其中t测量:可测量
{
}
即使在第6版中,C#也没有像在方法中那样的泛型类型参数推断。顺便说一句,很难通过用法推断泛型类型参数。C#编译器如何知道泛型参数是TValue
?也许一些新的通用约束,如TValue是TMeasure
?谁知道呢;)
似乎上述解决方案是最好的解决办法,也是通过设计将通用参数具体化的最常见解决方案。显然销售:IAMMeable,IAMMeable,IAMMeable
会混淆你的事实
如果你所寻找的是允许的……啊!我没有意识到一个类可以实现同一个接口两次,提供不同的tValue。有什么方法可以限制它吗?这里t值在中是未知的,在中t测量:iamavable
。将其更改为iamable
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; }
}
public class DecimalFact<TMeasure> : Fact<TMeasure, decimal>
where TMeasure : IAmMeasurable<decimal>
{
}