2016-10-13 8 views
1

基本クラスを継承するが、このケースは見えなかったジェネリッククラスの定義に関連する多くの質問を見てきました。 (私がそれを忘れた場合は申し訳ありません)C#一般的でないクラス構文エラーのある一般的なクラス定義

My classは汎用クラスです。これは、具象基底クラスを継承します。基本クラスのコンストラクタは引数をとります。

次のように私は、一般的な仕様を排除する場合、私はクラス定義の作業を行うことができます。ここでは

public class DataItemType : DataItem 
{ 
    public DataItemType(string sNameArg, string sAddressArg, bool nWriteAllowedArg) 
     : base(sNameArg, sAddressArg, nWriteAllowedArg) 
    { 
    } 
} 

は、一般的な仕様と定義です。クラス定義行で

public class DataItemType<TValue> : DataItem where TValue : struct 
{ 
    public DataItemType<TValue>(string sNameArg, string sAddressArg, bool nWriteAllowedArg) 
     : base(sNameArg, sAddressArg, nWriteAllowedArg) 
    { 
    } 
} 

、IDEは必要な仮パラメータベースクラスのsNameArgに対応して与えられた引数がないと文句を言い。 IDEはコンストラクタを作成することを提供します。しかし、そうすると、構文は失敗します。 (挿入されたコンストラクタは、それは価値がある何のために、どちらかの、いずれかの意味をなすようには見えません。)

+1

「DataItemType」コンストラクタから「」をスキップ –

答えて

4

ちょうどジェネリッククラスのコンストラクタの行から<TValue>を削除:

public class DataItem 
{ 
    public DataItem(string sNameArg, string sAddressArg, bool nWriteAllowedArg) {} 
} 

public class DataItemType<TValue> : DataItem where TValue : struct 
{ 
    public DataItemType(string sNameArg, string sAddressArg, bool nWriteAllowedArg) 
     : base(sNameArg, sAddressArg, nWriteAllowedArg) 
    { 
    } 
} 

の使用汎用クラスのTValueは、関数または戻り値に渡すパラメータ用です。しかし、コンストラクタではありません。

機能の後に<>を追加すると混乱します。そこに追加することは、関数自体が汎用的であり、異なるタイプを受け取ることができることを意味します。メソッドのジェネリック医薬品については

  • たとえばあなたがしてジェネリック型からであるコンストラクタのパラメータを受信したい場合は、クラスのジェネリック医薬品についてはGeneric Methods
  • Generic Classes

を参照してください参照してください。

public class DataItemType<TValue> : DataItem where TValue : struct 
{ 
    public DataItemType(TValue someParameter, string sNameArg, string sAddressArg, bool nWriteAllowedArg) 
     : base(sNameArg, sAddressArg, nWriteAllowedArg) 
    { 
    } 

    //Note that as in the constructor you can use this generic type for the function 
    public void SomeFunction(TValue value) { } 

    //Or define a new generic type which will be only in the scope of this function 
    public void SomeOtherFunction<TValue2>(TValue2 value2) { } 
} 
+0

あなたは正しいです。私はGeneric ClassesとGeneric Methodsのページを何度か読んだことがあります。私はクラス定義のジェネリックパラメータをクラス名の一部として取った。コンストラクタはクラスと同じ名前でなければなりません。コンストラクタ名にジェネリックパラメータを置きます。誤解を訂正するために、オンラインプログラミングガイドには何も表示されません。 C#の仕様は、現時点では明らかではありません。 – CallMeGeorge

+0

@ GregoryAshmore - 私は誤解がどこから来るかを見ることができます:)あなたは私の答えでそれを解決することができてうれしい –

関連する問題