6

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

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

...コンパイラは、タイプ「int」を「T」に変換できないと不平を言いますが、ターゲットが整数であることを示す制約があります。それで、確かにそれはうまくいくはずですか?

アップデート:

実際のシナリオでは、列挙値を返すヘルパー メソッドが必要です。したがって、私の理想的なヘルパー メソッドは、次のようになります....

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");

...しかし、列挙型で制約することはできません。

4

3 に答える 3

7

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

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

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

UPD

Enum 制約については、この質問を参照してください - Is there a workaround for "special class" Enum in C# 3.0?

于 2012-08-02T04:08:19.680 に答える
4

int (および他のすべての数値型と列挙型) は、一般的な制約として使用できません。

見る

汎用 C# コードと Plus 演算子

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

C# の作成者である Anders Hejlsberg とのジェネリックと型制約に関するディスカッションについては、次を参照してください。

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

次のようにstructの型制約を設定できます。

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

Generic<int> gen = new Generic<int>();
于 2012-08-02T04:06:23.197 に答える
2

本当にコンパイルしていますか?

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

エラー CS0701: 'int' は有効な制約ではありません。制約として使用される型は、インターフェイス、非シール クラス、または型パラメーターである必要があります。

于 2012-08-02T04:06:49.027 に答える