Почему я должен привести к параметру типа и не могу использовать ограниченный тип?

Может кто-нибудь объяснить, почему я должен привести к 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 вы просто получите нулевую ссылку.

Другие вопросы по тегам