Почему преобразования из «класса A: IX» для общего «T где t: ix» не разрешено?
-
12-11-2019 - |
Вопрос
Почему следующее вызывает ошибку компиляции?
interface IX {}
interface IY {}
class XY : IX, IY {}
void Foo<T>() where T : IX, IY
{
T xy = new XY();
… // ^^^^^^^^
} // error: "Implicit conversion of type 'XY' to 'T' is not possible."
.
class XY : IX
для where T : IX
» , который не ответил бы / EM> Это преобразование не удается.
Решение
Учитывая генеракодицетагкод и генеракодицетагкод, вы ожидаете, что смогут использовать class ABC : IX, IY { }
тогда?Потому что у вас не должно иметь это ожидания.Компилятор тоже не будет.
t не всегда будет XY.T собирается быть abc, def, или что-нибудь еще , которое может реализовать ваши два интерфейса и поэтому соответствовать у вас ограничениям.XY не является конвертируемым в ABC, Def, или любой из бесконечных возможностей для T , и поэтому у вас есть сообщение об ошибке: неявное преобразование XY в T невозможно.
Что было бы законным, есть просто Foo<ABC>
, и это верно только , если метод ограничен его поддержкой.
.void Foo<T>() where T : IX, IY, new()
{
T obj = new T();
}
Другие советы
Потому что, если бы это было законно, то вы могли бы сделать это:
interface IPet {}
interface IMammal {}
class Dog : IPet, IMammal {}
class Cat : IPet, IMammal {}
T Foo<T>() where T : IPet, IMammal
{
return new Dog();
}
...
Cat cat = Foo<Cat>(); // Assigns a Dog to a variable of type Cat.
.