Почему преобразования из «класса A: IX» для общего «T где t: ix» не разрешено?

StackOverflow https://stackoverflow.com/questions/9436516

Вопрос

Почему следующее вызывает ошибку компиляции?

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.
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top