C#泛型类型:来自外部类型的警告

Fah*_*din 3 c# generics types generic-type-argument

我有一个名为UserController的控制器,通用类型为T:

public class UserController<T> : Controller
{    
}
Run Code Online (Sandbox Code Playgroud)

然后,在这个类中,我有一个名为Select()的方法,带有泛型类型:

public override T Select<T>(ushort id)
{
    // UserModel is just a Class where I is an integer typed property
    UserModel.I = 2;
    object result = UserModel.I;

    return (T)Convert.ChangeType(result, typeof(T));
    throw new NotImplementedException();
}
Run Code Online (Sandbox Code Playgroud)

现在在另一个表单类中,我正在访问此方法,如下所示:

// This is so far working
UserController<int> us = new UserController<int>(0);
label1.Text = us.Select<string>(0);
Run Code Online (Sandbox Code Playgroud)

现在我有这个警告:

Severity    Code    Description Project File    Line    Suppression State
Warning CS0693  Type parameter 'T' has the same name as the type 
parameter from outer type 'UserController<T>'
Run Code Online (Sandbox Code Playgroud)

我不明白这里说的是什么:

Type parameter 'T' has the same name as the type 
parameter from outer type 'UserController<T>'
Run Code Online (Sandbox Code Playgroud)

我在这做错了什么?

Dam*_*ver 6

如果希望使用与类相同的类型参数化方法,则不要在方法名称中包含泛型参数:

public override T Select(ushort id) /* Uses T from class */
Run Code Online (Sandbox Code Playgroud)

但是,从您的其他示例中看起来您想要使用不同的类型 - 因此请为参数使用不同的名称:

public override TInner Select<TInner>(ushort id)
{
    // UserModel is just a Class where I is an integer typed property
    UserModel.I = 2;
    object result = UserModel.I;

    return (TInner)Convert.ChangeType(result, typeof(TInner));


    throw new NotImplementedException();
}
Run Code Online (Sandbox Code Playgroud)

(一般来说,尝试选择比公正T或更好的名称TInner- 就像你应该为其他参数选择好名字一样,尝试在类型参数名称中传达类型的目的)