Почему я должен привести к параметру типа и не могу использовать ограниченный тип?
Может кто-нибудь объяснить, почему я должен привести к T и почему Add2 не принимает Bar в качестве параметра?
class Foo<T> where T : class, IBar
{
void Add1(IDo<T> @do) { @do.Stuff(new Bar() as T); }
// Add2 does not compile:
// Argument type Bar is not assignable to parameter Type T
void Add2(IDo<T> @do) { @do.Stuff(new Bar()); }
}
interface IBar {}
class Bar : IBar {}
interface IDo<in T> {
void Stuff(T bar);
}
1 ответ
Решение
Это может быть неуместно. Например, рассмотрим:
class Other : Bar {}
...
IDo<Other> do = new DoImpl<Other>();
Foo<Other> foo = new Foo<Other>();
foo.Add2(do);
С вашим текущим кодом, это будет вызывать do.Add2(new Bar())
... который явно недействителен как Bar
не является Other
требуется IDo<Other>.Stuff
,
Кастинг в T
(или используя as
) тоже не подходит - вы не можете разыграть new Bar()
в Other
и если вы используете as
вы просто получите нулевую ссылку.