Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在实例化泛型类时避免指定冗余类型_C#_.net_Generics_C# 4.0_Interface - Fatal编程技术网

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>
{
}