如何解决泛型类中未使用的类型参数
假设我有如下类:
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 在这里给出警告,未使用类 Input 中的泛型类型参数 T。但是它在 Foo() 中被间接使用。
我的问题是,我可以安全地忽略这个 Resharper 警告,还是这个设计有问题?基本上,我希望类 Input 的实例包含有关类型 T 的信息,以便使用特定的 Input 实例仅创建特定类型的 Output。这也可用于在输出创建失败时诊断错误,并且我可以访问 Input 的实例(例如在异常中)并且想知道创建了哪种输出。
我想重新表述这个问题,有一个泛型类的类型参数定义其传递给其他类时的行为,但类型参数不用于定义此类中的任何数据,这样的设计是否可以接受?
解决方法
你写的是一个复杂的版本:
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
类不包含任何与 T
相关的信息,因此没有理由将其设为通用。您所写的内容在技术上并非不正确,但是您引入了人为限制,即给定的输入只能针对其构建的具体 Foo
进行 T
d。人工,因为 Input
携带的数据中没有任何东西以任何方式依赖于 T
。
这不好吗?不知道,你是故意这样的吗?如果以这种方式创建的约束正是您想要的,则取消警告。如果不是,则更改设计。这就是为什么这是一个警告,很有可能有人会在不知不觉中写下这个。
,我想重新表述这个问题,有一个泛型类的类型参数定义其传递给其他类时的行为,但类型参数不用于定义此类中的任何数据,这样的设计是否可以接受?
我会说这应该没问题。如果没有有关您的特定用例的更多详细信息,则很难判断,因为未显示 CreateOutput 方法。
我做了类似的事情来确保类型是明确的。例如,围绕 Guid 的 Id<T>
包装器有助于确保 Id<Orange>
不会传递到需要 Id<Apple>
的方法中。
您还可以考虑将类型存储为属性而不是泛型类型参数。即
public class Input
{
private Type myType;
这可能会使将类型转发到 CreateOutput 变得更容易,而不必使所有方法通用,这可能有好处也有坏处,具体取决于您如何使用它。
Resharper 警告很好,但我会很担心它们。我会更关心实际的编译器警告。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。