Но независимо от того, какой тип является param, он обрабатывается как класс BaseB, и я должен явно привести его к требуемому типу, чтобы получить правильное значение SomeProperty.
Да.Поскольку это связывание выполняется во время компиляции, в этот момент компилятор знает только о BaseB.SomeProperty
.Это свойство, на которое будут ссылаться в IL, и свойство, которое будет выбрано во время выполнения.
Я бы сказал, что наличие двух независимых свойств с одинаковым именем действительно сбивает с толку,Если вы действительно хотите сделать это, вы можете заставить привязку произойти во время выполнения, вместо этого используя динамическую типизацию:
static void SomeMethod<T>(T param) where T : BaseB
{
dynamic d = param;
// This will use the execution-time type of param
var tmp1 = d.SomeProperty;
}
Но я бы полностью избежал этой схемы, если бы вы могли,Либо имеют отдельно названные свойства, поэтому они, очевидно, независимы, либо свойство с единичным элементом состояния, к которому можно получить доступ по-разному в зависимости от «представления» экземпляра (с риском исключений, если вы установитесвойство «неправильного» типа).