私はジェネリックの奇妙な振る舞いを経験しました。以下は私がテストに使用するコードです。一般的な奇妙な振る舞い
public static class Program
{
public static void Main()
{
Type listClassType = typeof(List<int>).GetGenericTypeDefinition();
Type listInterfaceType = listClassType.GetInterfaces()[0];
Console.WriteLine(listClassType.GetGenericArguments()[0].DeclaringType);
Console.WriteLine(listInterfaceType.GetGenericArguments()[0].DeclaringType);
}
}
出力:
System.Collections.Generic.List`1[T]
System.Collections.Generic.List`1[T]
私は、ジェネリック型定義を使用するため、2番目のConsole.WriteLineを呼び出し、クラスではなくインタフェースを表示すること、それは非常に奇妙ました。これは正しい動作ですか?
私はコンパイラで汎用型の推論を実装しようとしています。次のコードがあるとします。
public static class GenericClass
{
public static void GenericMethod<TMethodParam>(IList<TMethodParam> list) { }
}
そして、私は次のようにこのメソッドを呼び出したい:
GenericClass.GenericMethod(new List<int>());
推論の可能性を確認するために、私は、メソッドのシグネチャタイプを比較する必要があり、引数の型が渡されました。しかし、以下のコードはfalseを返します。
typeof(GenericClass).GetMethods()[0].GetParameters()[0].ParameterType == listInterfaceType;
このような比較には常にType.GetGenericTypeDefinitionを使用する必要がありますか?
まあ、いずれの場合でも、バインドされていないジェネリックリストからコールチェーンを調達しているため、宣言型は常にそのバインドされていないジェネリック型になります。あなたは何をしようとしているのですか? –
JerKimball