次のスニペットを検討してください。
protected object GetArg(Dictionary<string, object> args, string argName)
{
object arg;
if (args.TryGetValue(argName, out arg))
{
return arg;
}
return null;
}
protected T GetArg<T>(Dictionary<string, object> args, string argName) where T : class
{
return GetArg(args, argName) as T;
}
//following does not compile:
//Type ... already defines a member called 'GetArg' with the same parameter types
protected T GetArg<T>(Dictionary<string, object> args, string argName) where T : struct
{
Nullable<T> arg = GetArg(args, argName) as Nullable<T>;
return arg.HasValue ? arg.Value : default(T);
}
上記のジェネリック宣言間で T パラメーターの型を相互に排他的であるように制約することは、明確性を保証するのに十分ではないでしょうか? この場合、型制約がコンパイラによって考慮されないのはなぜですか? 足りないものはありますか?