Во время компиляции не проверяется приведение интерфейса к классу.
Как видите, вы даже можете скомпилировать, что:
class Program
{
static void Main(string[] args)
{
IPizza<Pasta> ao = new Pizza<Pasta>();
((Pasta)ao).MyProperty = 10;
}
}
public interface IPizza<T>
{
}
public class Pizza<T> : IPizza<T>
{
}
public class Pasta
{
public int MyProperty { get; set; }
}
Будет проверен интерфейс, приведенный к классу во время выполнения.
Infact, если вы используете как тип Pizza<Pasta>
вместо IPizza<Pasta>
, это даст вам ошибку компиляции:
class Program
{
static void Main(string[] args)
{
Pizza<Pasta> ao = new Pizza<Pasta>();
((Pasta)ao).MyProperty = 10;
}
}
public interface IPizza<T>
{
}
public class Pizza<T> : IPizza<T>
{
}
public class Pasta
{
public int MyProperty { get; set; }
}