请考虑这种情况:
public class TestType
{
public string a
{
get;
set;
}
public string b
{
get;
set;
}
public override string ToString()
{
return string.Format("a: \"{0}\"\tb:\"{1}\"", a, b);
}
}
TestType类是在类库中编译的,然后我在这个简单的程序中使用它:
static void Main(string[] args)
{
TestType tP = new TestType();
tP.a = "a";
tP.b = "b";
Console.WriteLine(tP.ToString());
Console.ReadKey(true);
}
显然它有效(正确执行没有错误)。
输出:a:" a" B:" B"
然后我像这样编辑库中的类:
public class TestType
{
public string a
{
get;
set;
}
public string b
{
get;
set;
}
public string c
{
get;
set;
}
public override string ToString()
{
return string.Format("a: \"{0}\"\tb:\"{1}\"\tc:\"{2}\"", a, b, c);
}
}
我只重新编译库并重新运行程序(不重新编译它)。 现在我预计程序会崩溃,因为它不知道类的变化,但是它有效。
输出:a:" a" B:" B" C:""
如果类型与它知道的类型不同,它如何工作?
答案 0 :(得分:3)
.NET DLL具有一定程度的向后兼容性。添加字段不是binary-breaking change。
答案 1 :(得分:2)
您的更改未破坏类TestType
的界面(并且严格地说是附加的),因此没有API兼容性失败。
请记住,.NET程序实际上是在JIT过程中在运行时编译的,这时会识别出像这样的错误。请注意,.NET使用名称作为链接的方式而不是GUID或其他标识符,因此您可以将任何程序集替换为另一个程序集,前提是它包含具有相同预期成员的相同预期类型 - 这是一个安全问题,因此存在强命名的原因