C#泛型类重复声明疑问:类型参数顺序是否影响类区分?
问题解答
你的推测不完全准确,编译器判定重复类声明的核心原因是这两个泛型类的未绑定泛型类型签名完全一致,和方法重载的规则本质不同:
- 泛型类的唯一性判定只看类名+泛型参数的数量,完全不关心类型参数的名称、顺序,或是它们的约束条件。你写的两个类都是
SubProcess<,>(带两个类型参数的版本),不管你把类型参数命名成TSubProcessParameters,TInitialState还是TInitialState,TSubProcessReturnValues,编译器都会认为是同一个未绑定泛型类的重复声明。 - 方法重载的规则不一样:方法重载的区分依赖于参数列表的完整签名,包括参数的数量、类型(以及泛型参数的构造),参数顺序是签名的一部分,所以顺序不同的方法会被视为不同重载。但泛型类的未绑定类型标识不包含参数名称或顺序,只认类名和参数个数。
如果要区分这两个类,最合理的方式是给它们起不同的类名(比如ParameterizedSubProcess<TParams, TState>和ReturningSubProcess<TState, TResults>),避免用相同类名搭配不同顺序的泛型参数。
内容的提问来源于stack exchange,提问作者philreed
相关产品推荐
相关产品推荐

