更改通用参数名称的重大更改

时间:2019-11-07 01:46:35

标签: c#

更新库时,准确传达任何重大更改很重要。不幸的是,C#中存在许多不同类型的重大更改,其中一些非常微妙。

显而易见的是诸如更改类型名称或类型成员的名称。

细微的东西是诸如adding a new default parameter(二进制兼容性被破坏,但保留了源兼容性)或renaming a parameter(二进制兼容性被维护,但是了源兼容性被破坏)之类的东西。

我不确定要重命名通用参数。

例如,在某些情况下需要更改:

public class Foo<T>
{
  public T Bar(){ /* something */ }
}

public class Foo<TMoreDescriptive>
{
  public TMoreDescriptive Bar(){ /* something */ }
}

两次发布的库之间可能会破坏消费者?

3 个答案:

答案 0 :(得分:5)

不,没有这种情况。

更改通用类型参数的名称与更改方法参数的名称相比,没有什么大的改变。 According to the C# Programming Guide,在使用者使用通用类型参数实例化类时,将替换通用类型-除非通过文档或类似IntelliSense的功能,否则使用者不会获得原始类型参数的名称。

该指南还提到,泛型类型参数可以通过反射获得-这很可能是您的消费者能够以编程方式检查名称更改的唯一向量,类似于方法参数。

答案 1 :(得分:2)

泛型在编译时解析,以便进行编译时类型检查。确实,允许进行这些检查是他们的目的。

虽然我都不知道任何信息,但我看不到这会破坏任何东西。

保持源兼容性。

并且二进制兼容性应该只关心其中的内容,而不是T / TMoreDescriptive / type占位符。

值得指出的是,.NET关于加载的.dll 非常具体。制作.NET时,我们至少有十年的经验,仅使用dll名称会导致版本问题。因此,.NET使用DLL的名称,版本和公共令牌(例如GUID)来确定它确实是编译器所针对的 exact DLL。因此,如果要进行重大更改,只需确保获得另一个公共令牌即可解决。

答案 2 :(得分:2)

由于您只是在更改通用类型占位符的名称,因此这应该不是问题。但是,作为一般规则,您不应使事情过于复杂。如果您的通用类只有一种遗传类型,那么T和TSomething一样清晰。实际上,使用T已成为泛型的标准。
但是,如果泛型类使用两种类型,则描述性更好的名称会更好。所以,

public class Foo<T1, T2>
{
    public T1 Bar(T2 something) { return ... }
}

会很糟糕。您宁愿拥有

public class Foo<TResult, TSource>
{
    public TResult Bar(TSource something) { return ... }
}

但是同样,如果只有一种类型,请坚持使用T。更改名称并不重要,因为它只是一个占位符。