Я думаю, что преимущество систем структурного типа состоит в том, что они побуждают вас создавать детализированные интерфейсы, ориентированные на то, что нужно пользователю интерфейса, а не на то, что обеспечивает разработчик.
В системе именительного типа вам нужна общая зависимость от интерфейса. В системе структурных типов это требование устраняется: вы можете создать слабо связанную систему без необходимости создавать ту общую библиотеку, в которую вы помещаете все интерфейсы. Каждый клиент может независимо объявить интерфейс, который он ожидает от соавтора.
Недостатком систем структурных типов является то, что они сопоставляют классы с интерфейсами, которые могут не реализовывать правильный контракт. Например, если у вас есть этот интерфейс:
public interface IBananaProvider
{
/// Returns a banana, never null.
Banana GetBanana();
}
тогда неявно будет рассмотрен следующий класс для реализации IBananaProvider
в системе структурных типов. Однако класс нарушает условие post, что возвращаемый банан никогда не будет нулевым:
public class SomeBananaProvider
{
// returns a banana or null if we're all out
public Banana GetBanana()
{
if (bananas.Count > 0)
{
return bananas.RemoveLast();
}
else
{
return null;
}
}
}
Это может быть исправлено, если договор был каким-то образом определен формально и считается частью структуры типа. Я думаю, что вещи движутся в этом направлении, например, System.Diagnostics.Contracts в .NET 4.0.