struct
является типом значения, а IArguments
является ссылочным типом. Тип ссылки - NULLable
, однако тип значения - , а не NULLable
. Поскольку общие ограничения c всегда равны "И", это означает, что ваш T
должен удовлетворять всем условиям, которые записаны в вашем выражении where
- where T : struct, IArguments
. Так что это причина, по которой вы получили ошибку:
Тип 'IArguments' должен иметь тип значения, не допускающий значения NULL, чтобы использовать его в качестве параметра 'T' в общем * 1026. * тип или метод 'ICommandProvider'
ОБНОВЛЕНИЕ:
Может быть, эта реализация будет полезна:
static void Main(string[] args)
{
ICommandProvider<IArguments> provider = new ConcreteProvider1();
var providers = new ICommandProvider<IArguments>[]
{
new ConcreteProvider1(),
new ConcreteProvider2()
};
}
И другой код выглядит как это:
interface ICommandProvider<T> where T : IArguments
{
void F(string command, T arguments);
}
class ConcreteProvider1 : ICommandProvider<IArguments>
{
public void F(string command, IArguments arguments)
{
throw new NotImplementedException();
}
}
class ConcreteProvider2 : ICommandProvider<IArguments>
{
public void F(string command, IArguments arguments)
{
throw new NotImplementedException();
}
}
interface IArguments { }
class ConcreteArguments1 : IArguments { /* some value type properties */ }
class ConcreteArguments2 : IArguments { /* some value type properties */ }