2015-09-12 33 views
3

我有一個如下定義的通用接口(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米)。

+2

Obvioulsy'銷售:IAmMeasurable ,IAmMeasurable ,IAmMeasurable '會迷惑你的'Fact'如果你在尋找什麼讓... –

+0

啊!我沒有意識到一個類可以實現兩次相同的接口,提供不同的TValue。有什麼辦法來限制嗎? – SFun28

回答

0

如果你想避免這種情況,你只需要設計一箇中間類,其中的FactTValue是十進制:

public class DecimalFact<TMeasure> : Fact<TMeasure, decimal> 
    where TMeasure : IAmMeasurable<decimal> 
{ 
} 

即使在第6版,C#有沒有泛型類型參數推斷像它會發生在方法中。順便說一句,通用的類型參數很難被使用所引用。 C#編譯器如何知道IAmMeasurable<T>T通用參數是TValue?也許一些新的通用約束如TValue is TMeasure?誰知道;)

看來上面的解決方案是最好的解決方法,它是通過設計具體化通用參數的最常見解決方案。

+0

這裏'TValue'在'where TMeasure:IAmMeasurable '中是未知的。將其更改爲'IAmMeasurable ' –