Является ли перемещение общедоступного свойства в базовый класс критическим изменением в общедоступном API?C#

Место общения программистов C#
Ответить
Anonymous
 Является ли перемещение общедоступного свойства в базовый класс критическим изменением в общедоступном API?

Сообщение Anonymous »

Я столкнулся с проблемой, с которой раньше не сталкивался.
Я использую стороннюю сборку, которая поставляется в двух разных версиях. Я компилирую один из них и загружаю правильную версию во время выполнения.
Версия, с которой я компилировал, выглядит как (V2.0.0)

Код: Выделить всё

public class A { public int P1 { get; set; } }
public class B : A { public int P2 { get; set; } }
Тот, который я загрузил во время выполнения, выглядит как (V1.0.0)

Код: Выделить всё

public class A { public int P1 { get; set; } public int P2 { get; set;} }
public class B : A { }
Код в вызывающей сборке выглядит так:

Код: Выделить всё

public static void Main() {
var b = new B();
b.P2 = 3;
}
К моему удивлению, b.P2 терпит неудачу при загрузке V1.0.0 во время выполнения.
Интуитивно я могу это понять. В скомпилированной версии есть ссылка на B::P2, которой не существует, но это также кажется странным, поскольку B::P2 находится в общедоступном API B и то, что он реализован в A::P2, является деталью, которая не должна это (или я надеялся, что это не должно) иметь значение.
Я, конечно, могу решить эту проблему путем «перекомпиляции» правильной версии, но тогда я предполагаю, что проблема будет с V2.0.0 вместо этого.
Есть ли способ избежать наличия двух версий моего приложения?
Если это имеет значение, сторонняя сборка — это .NetFramework, а моя код — DotNet 8.
Изменить: извините, я неправильно определил классы.
V1.0.0 выглядит так< /p>

Код: Выделить всё

public class B { public int P1 { get; set; } public int P2 { get; set;} }
Это означает, что с точки зрения версии, скомпилированной с V2.0.0, метод перешел в более производный класс (от A к B). В документе, на который есть ссылка @canton7, это кажется критическим изменением.
Но это также означает, что компиляция с V1.0.0 и загрузка V2.0.0 должны работать, поскольку
  • разрешено добавление базового класса без абстрактных/виртуальных членов.
  • разрешено перемещение членов в базовые классы.
Я узнал, что при компиляции вы получаете ссылку на (базовый) класс, в котором определен член, даже если вы вызываете доступ к нему через открытый интерфейс производного класса.

Подробнее здесь: https://stackoverflow.com/questions/791 ... public-api
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»