C#での制約、そして自分自身に次のような課題を思い付いた:ユーザー定義のコンパイル時の型私は現在、C#でジェネリックを試してい
汎用関数f<T>
考えると、Tはコンパイル時に検証与えられた集合[T1、T2、...、Tn]からの型。 f<T>
に我々は
CompileTimeAssert<T>.isContainedIn<TypeList<string, int, bool>>();
を持っている場合たとえば、その後、f<int>
はコンパイルしなければならない、とf<double>
はコンパイルべきではありません。
まだありません。上記のコードを考える
interface ContainsType<T> {}
class TypeList<T1>: ContainsType<T1> {}
class TypeList<T1, T2>: TypeList<T2>, ContainsType<T1> {}
class TypeList<T1, T2, T3>: TypeList<T2, T3>, ContainsType<T1> {}
class TypeList<T1, T2, T3, T4>: TypeList<T2, T3, T4>, ContainsType<T1> {}
// add longer type lists to taste
class CompileTimeAssert<T>
{
public static void isContainedIn<TypeList>()
where TypeList: ContainsType<T> {}
public static void isContainedIn<TypeList>(TypeList tl)
where TypeList: ContainsType<T> {}
}
は、(予想通り)、次のコンパイル:
// uses first overload
CompileTimeAssert<int>.isContainedIn<TypeList<string, int, bool>>();
var myTypeList = new TypeList<string, bool>();
CompileTimeAssert<string>.isContainedIn(myTypeList); // uses second overload
そして次はコンパイルされません、また期待通り:これは私がこれまで持っているものである
CompileTimeAssert<short>.isContainedIn<TypeList<string, int, bool>>();
var myTypeList = new TypeList<string, bool>();
CompileTimeAssert<double>.isContainedIn(myTypeList);
これはとてもかわいいですが、役に立たないこともあります。
void f<T>()
{
CompileTimeAssert<T>.isContainedIn<TypeList<string, int, bool>>();
}
をしてからf<int>
コンパイルし、コンパイル・エラーでf<double>
結果を持っている:1は、次の操作を行うことができれば、それははるかに便利になります。
上記のように、f<T>
はコンパイルに失敗します(具体的な種類の呼び出しに関係なく)。 私がする(Mac OS X上でMonoDevelopのを使用して)、次のエラーを取得しています:
エラーCS0311: ' へ 'タイプ
TypeList<string,int,bool>' cannot be used as type parameter 'TypeList' in the generic type or method 'CompileTimeAssert<T>.isContainedIn<TypeList>()'. There is no implicit reference conversion from
タイプリストContainsType'
を、これはdoesnの理由を私は一種の理解'今のところ、私は働いている代替案を考え出すことができませんでした。誰も私が望むものがC#で可能かどうかについてのアイデアはありますか?
ありがとうございました。
あなたはおそらく、アスペクト指向プログラミングを使用してこの機能を実装する方がよいでしょう。 http://www.sharpcrafters.com/ –
あなたは本当にあなたのインタフェースの前に 'I'を付けてください。 – bevacqua
M.Babcock:ありがとう、PostSharpは涼しくて有望で、私はそれを "チェックアウト"リストに入れます。私がC#を習得したばかりなので、それが始まるまでには時間がかかるかもしれません。 –