2016-07-07 18 views
2

私は一般的な制約を利用して読んできましたが、私はジェネリックがstruct,class,new,ClassおよびInterfaceに制限されることがわかりました。最初の3つの理由はかなり明らかです。しかし、私は実際にを理解することができませんなぜは、クラスに制約する。すなわち特定のクラスに対する一般的な制約は、なぜですか?

class Foo<T> where T : Bar 
class Foo<T> where T : IBar 

これにより、Barとその子、IBarと実装者をそれぞれ制約できます。私たちはそのクラスやインターフェイスにただプログラムできませんか?これは基本的に多形のためであり、Microsoftエンジニアは役に立たない機能を実装するために馬鹿から遠いからです。

私には何が欠けていますか?


アップデート:私はそれはケースだとは思わないWhy use generic constraints in C#

私の質問はのための重複としてマークされています。

私はこの質問を徹底的に熟読して答えを見つけませんでした。それは一般的な制約の使用について議論しましたが、ここで私はなぜクラスやインターフェースに制約を課すのですか?それを直接プログラムするだけですか?

+2

[this](https://msdn.microsoft.com/en-us/library/bb396189(v=vs.110).aspx)のようなものですか?任意のタイプをサポートする[別のアプローチ](https://msdn.microsoft.com/en-us/library/bb669096(v=vs.100).aspx)があります。 –

+2

私にとっては、一般的なTから必要なときにクラスに便利です。新しいキーワード – Alexandr

+2

でクラスを作成します。これは重複しません。なぜ 'Foo'を単に実装するのではなく、クラスに対してコード化されています。依頼者は、インターフェイスで使用する場合に制約が有効である理由を理解しますが、なぜそれらがクラスに対して有用であるのか理解できません。 – Lukazoid

答えて

2

おそらく、この単純な例が役立つかもしれません。

私は、これらのクラスがある場合:

public class ListOfCars<T> : List<T> where T : Car { } 

public abstract class Car { } 
public class Porsche : Car { } 
public class Bmw : Car { } 

を...と私はこのコードを書いた場合、その後:

var porsches = new ListOfCars<Porsche>(); 

// OK 
porsches.Add(new Porsche()); 

//Error - Can't add BMW's to Porsche List 
porsches.Add(new Bmw()); 

をあなたは私がポルシェリストにBMWを追加することができないことを見ることができますしかし、私が基本クラスからプログラムしたばかりの場合、それは許されます。