2

タイプ 'int'に制約されているジェネリックメソッドがある場合は、必ずジェネリックTタイプに整数をキャストできます。例えば...

    public T ExampleMethod<T>(int unchanged) where T : int
    {
        return (T)unchanged;
    }

...コンパイラはそれに不平を言うタイプ 'int'を 'T'に変換できませんターゲットが整数であることを示す制約があります。だから確かにそれは動作するはずですか?

更新:

実際のシナリオは、enum値を返すヘルパーメソッドが必要なことです。だから私の理想的なヘルパーメソッドは、もっとこれに似ています....

public T GetAttributeAsEnum<T>(XmlReader reader, string name) where T : enum
{
    string s = reader.GetAttribute(name);
    int i = int.Parse(s);
    return (T)i;
}

...これをこのように使う...

StateEnum x = GetAttributeAsEnum<StateEnum>(xmlReader, "State");
CategoryEnum y = GetAttributeAsEnum<CategoryEnum>(xmlReader, "Category");
OtherEnum z = GetAttributeAsEnum<OtherEnum>(xmlReader, "Other");

...あなたはenumで制約することはできません。


  • なぜパラメータタイプをT? - gilly3
  • 私の実際の状況はもっと複雑です。私は、ファイルから文字列を読み込むヘルパーメソッドを必要とします。文字列は実際には数値です。次に、数値を正しいターゲット列挙型にキャストします。そう... - Phil Wright
  • これはコンパイルされません。エラー:' int'有効な制約ではありません。制約として使用されるタイプは、インターフェース、非密封クラス、またはタイプ・パラメーターでなければなりません。 - Adriaan Stander
  • もしTジェネリックを使用する理由は常にintですか? - default locale
  • public T Method (XmlReader reader)ここで、T:enum {string s = reader.GetAttribute( "whatever"); int i = int.Parse(s); return(T)i; } - Phil Wright

3 답변


7

"クラスまたはインタフェースのみが制約として指定できます。"(c)ReSharper

int(Int32)は単なる構造体です。あなたはTが構造体。構造体を制約として使用することはできません。

あなたがここで見つけることができる可能な制約の全リスト - http://msdn.microsoft.com/en-us/library/d5x73970.aspx

UPD

Enumの制約については、この質問を参照してください - &quot;特別なクラス&quot;のジェネリックタイプ制約の回避策はありますか? C#3.0のEnum?


  • A構造体制約として使用することもできます。次のコンパイルが行われます。public class Generic<T> where T : struct { }。そのクラスを次のようにインスタンス化できます。Generic<int> gen = new Generic<int>();。 - Eric J.
  • @EricJ。あなたは理解できません。 Tを "a struct"と拘束できますが、構造体を制約として使用することはできません。 - Dmitry Khryukin
  • 私はあなたがどこから来ているのかを見ます。しかし、あなたの答えは誤解を招きます。あなたに加えて構造体指定することもできます新しい制約として。それらのいずれも「クラスまたはインタフェース」ではない。 - Eric J.
  • @EricJ。更新しました!誤解を招くようなことはありませんか? - Dmitry Khryukin
  • 今私によく見えます。 - Eric J.

4

int(および他のすべての数値型と列挙型)は、ジェネリック制約として使用できません。

見る

汎用C#コードとプラス演算子

詳細とオプションについては、

ジェネリックスと型制約については、C#の作成者Anders Hejlsbergとの議論

http://www.artima.com/intv/generics.html

型制約を置くことができます。構造体このような:

public class Generic<T> where T : struct { }

Generic<int> gen = new Generic<int>();


  • 降下者:この答えに何が間違っていますか?私たちはすべて学ぶことができるように共有してください。 - Eric J.

2

そのコンパイルは本当ですか?

ここでは、次のエラーが発生します。

エラーCS0701: 'int'は有効な制約ではありません。タイプとして使用される   制約は、インターフェース、非密封クラス、またはタイプでなければならない   パラメータ。

リンクされた質問


関連する質問

最近の質問