泛型中未使用的类型参数 class

unused type parameter in generic class

假设我有 class 如下所示:

public class Input<T>
{
    // some data here but type T is never directly used

    internal void Foo()
    {
        object output = someOther.CreateOutput(this);
        .....
    }
}
public class Output<T>
{
    public T Value { get; }
    //.....
}
class SomeOtherClass
{
    public Output<T> CreateOutput<T>(Input<T> input)
    {
       // type T is used here
    }
}

Resharper在这里给出警告,classInput中的泛型类型参数T没有被使用。但是它在 Foo() 中间接使用。

我的问题是,我可以安全地忽略这个 Resharper 警告,还是这个设计有问题?基本上,我希望 class Input 的实例包含有关类型 T 的信息,以便 Input 的特定实例仅用于创建特定类型的 Output。这也可用于在输出创建失败时诊断错误并且我可以访问 Input 的实例(例如在异常中)并且想知道正在创建哪种输出。

我想重新表述一下这个问题,拥有一个泛型 class 是一种可接受的设计吗?它的类型参数定义了它在传递给其他 classes 时的行为,但是没有使用类型参数在此 class?

中定义任何数据

你写的是以下的复杂版本:

public class Input
{
    internal void Foo<T>()
    {
        object output = someOther.CreateOutput<T>(this);
        .....
    }
}
public class Output<T>
{
    public T Value { get; }
    //.....
}
class SomeOtherClass
{
    public Output<T> CreateOutput<T>(Input input)
    {
       // type T is used here
    }
}

由于您的 Input class 不包含与 T 相关的任何信息,因此没有理由将其通用。您所写的内容在技术上并不正确,但您引入了一个人为限制,即给定输入只能是 Food 用于构造它的具体 T。人为的,因为 Input 携带的数据中没有任何内容以任何方式依赖于 T

这很糟糕吗?不知道,你是故意这样的吗?如果以这种方式创建的约束 是您想要的,则取消警告。如果不是,则更改设计。这就是为什么它是一个警告,很有可能有人会在不知不觉中写下它。

I guess to rephrase the question, is it an acceptable design to have a generic class whose type parameter defines its behavior when passed to other classes, but the type parameter is not used to define any data within this class?

我想这应该没问题。由于未显示 CreateOutput 方法,因此很难在没有有关您的特定用例的更多详细信息的情况下判断。

我做了类似的事情来确保类型是明确的。例如 Id<T> 围绕 Guid 的包装器,以帮助确保 Id<Orange> 不会传递到需要 Id<Apple>.

的方法中

您还可以考虑将类型存储为 属性 而不是泛型类型参数。即

public class Input
{ 
     private Type myType;

这可能会使将类型转发到 CreateOutput 变得更容易,而不必使所有尽可能多的方法通用,这可能有利有弊,具体取决于您的使用方式。

Resharper 警告很好,但我很担心它们。我会更关心实际的编译器警告。