将 属性 隐藏在基数 class 中会导致重大更改吗?
Will hiding a property in a base class cause a breaking change?
我有一个基础 class 'A'(一个集合),其中包含一个 ArrayList 和一个索引 属性,returns ArrayList 中的那个索引。我还有一个派生的 class 'B' 和泛型类型 T,作为 T 的集合。最后,有 classes 'C' - 'F'派生出 class B,每个 B 都有不同的 T。
代码如下所示:
public class A
{
protected ArrayList list;
public object this[int index] { get { return list[index]; } }
}
public class B<T> : A
{
}
public class C : B<G>
{
}
有第 3 方 .dll 使用这些 classes,所以我想知道我是否可以在不破坏这些程序集的情况下进行更改。我想在 B 中添加一个索引 属性,这将隐藏 A 中的索引 属性。
public class B<T> : A
{
// Adding this property
public new <T> this[int index] { get { return (T)list[index]; } }
}
现在其他 .dll 的代码可能如下所示:
C c = new C();
G g = (c[0] as G);
之前使用 'as' 进行转换的代码仍将使用新索引 属性 进行编译,但它也允许将代码简化为:
C c = new C();
G g = c[0];
我想知道将索引 属性 添加到 B 是否会破坏使用我的程序集的第 3 方 .dll。
我也非常感谢解释为什么或为什么不是重大更改。
我找到了问题的答案。这会在某种情况下造成二进制级别的中断。
如果我在派生 class 中创建一个 属性,它隐藏了基础 class 中的 属性,使用此更改编译的第 3 方 .dll 将不会旧版本的 .dll 的功能更长。新的 .dll 将在派生的 class 中引用 属性 进行编译,并尝试使用该 属性,这在我的旧版本的 .dll 中不存在。
我有一个基础 class 'A'(一个集合),其中包含一个 ArrayList 和一个索引 属性,returns ArrayList 中的那个索引。我还有一个派生的 class 'B' 和泛型类型 T,作为 T 的集合。最后,有 classes 'C' - 'F'派生出 class B,每个 B 都有不同的 T。
代码如下所示:
public class A
{
protected ArrayList list;
public object this[int index] { get { return list[index]; } }
}
public class B<T> : A
{
}
public class C : B<G>
{
}
有第 3 方 .dll 使用这些 classes,所以我想知道我是否可以在不破坏这些程序集的情况下进行更改。我想在 B 中添加一个索引 属性,这将隐藏 A 中的索引 属性。
public class B<T> : A
{
// Adding this property
public new <T> this[int index] { get { return (T)list[index]; } }
}
现在其他 .dll 的代码可能如下所示:
C c = new C();
G g = (c[0] as G);
之前使用 'as' 进行转换的代码仍将使用新索引 属性 进行编译,但它也允许将代码简化为:
C c = new C();
G g = c[0];
我想知道将索引 属性 添加到 B 是否会破坏使用我的程序集的第 3 方 .dll。
我也非常感谢解释为什么或为什么不是重大更改。
我找到了问题的答案。这会在某种情况下造成二进制级别的中断。
如果我在派生 class 中创建一个 属性,它隐藏了基础 class 中的 属性,使用此更改编译的第 3 方 .dll 将不会旧版本的 .dll 的功能更长。新的 .dll 将在派生的 class 中引用 属性 进行编译,并尝试使用该 属性,这在我的旧版本的 .dll 中不存在。