0

次のスニペットを検討してください。

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 パラメーターの型を相互に排他的であるように制約することは、明確性を保証するのに十分ではないでしょうか? この場合、型制約がコンパイラによって考慮されないのはなぜですか? 足りないものはありますか?

4

0 に答える 0