14


2

私は現在整数パラメータを取るいくつかのメソッドを持っているクラスがあります。 これらの整数は、アプリケーションが実行できる操作に対応しています。 クラスのコンシューマがその中のすべての操作で持つ列挙型を提供できるように、クラスを汎用にしたいのですが、メソッドはその列挙型のパラメータを受け取ります。 しかし、私はそれらが総称型をまったく指定できないようにし、そして現在の方法からの構文の変更なしでそれをデフォルトで整数に戻すようにしたいです。 これは可能ですか?

4 Answer


39


そう…​ 単純な継承を使わないのはなぜですか? 好きです:

クラスMyGenericClass {}

クラスMyGenericClass:MyGenericClass {}

このようにあなたは両方の方法を書くことができます:

var X = new MyGenericClass(); var Y = new MyGenericClass(); // MyGenericClassになりました


3


クラスの定義ではできません。

var foo = new MyGenericClass(); //デフォルトは整数... これは動作しませんvar bar = new MyGenericClass(); // TはMyEnumです

デフォルトの型が暗黙的にintであることを本当に重視する場合は、静的ファクトリメソッドを使用してそれを行う必要がありますが、その値はわかりません。

パブリッククラスMyGenericClass {public static MyGenericClass Create(){return new MyGenericClass();} } public static MyGenericClass CreateDefault(){new MyGenericClass()を返します。 }}

あなたが本当に上記から恩恵を受けない方法については、下記を参照してください。

var foo = MyGenericClass.Create(); var bar1 = MyGenericClass.CreateDefault(); //動作しないvar bar2 = MyGenericClass.CreateDefault(); //動作しますが、ポイントは何ですか

もっと遠くまで持ちたい場合は、これを解決する静的ファクトリクラスを作成することができますが、デフォルトの型を提供する以外の理由でそれを実行するのであれば、これはさらにばかげた解決策です。

パブリック静的クラスMyGenericClassFactory {パブリック静的MyGenericClass Create(){return new MyGenericClass();} } public static MyGenericClass Create(){return new MyGenericClass();} }}

var foo = MyGenericClassFactory.Create(); //これでint定義ができましたvar bar = MyGenericClassFactory.Create();


2


元のバージョン(非ジェネリックバージョン)を保存して、そのジェネリックバージョンを作成します。

それからあなたの非ジェネリックバージョンからジェネリックバージョンを呼び出します。

void Main(){DoSomething(2); DoSomething(EnumValue);

}

public void DoSomething(int test){DoSomething(テスト); }

// Define other methods and classes here
public void DoSomething(Tテスト){Console.WriteLine(テスト); }


1


コンパイラは、渡される引数の型に基づいて、ほとんどの場合*メソッド*の型引数を推測できます。

公開無効DoSomething(Tテスト){}

で呼び出すことができます

DoSomething(4); // = DoSomething(4); DoSomething(MyEnum.SomeValue); // = DoSomething(MyEnum.SomeValue);

ところで、ジェネリックメソッドの非ジェネリックオーバーロードも可能です。