C# приведение от IEnumerable <T>к T - PullRequest
0 голосов
/ 21 января 2020

Может кто-нибудь объяснить, что:

  • скомпилировать ОК
  • во время выполнения KO

Я уже проверил исходный код для IEnumerable <> & IEnumerable и К сожалению, ничего не найдено со списком

1010 *

Ответы [ 2 ]

0 голосов
/ 21 января 2020

Во время компиляции не проверяется приведение интерфейса к классу.

Как видите, вы даже можете скомпилировать, что:

class Program
{
    static void Main(string[] args)
    {
        IPizza<Pasta> ao = new Pizza<Pasta>();
        ((Pasta)ao).MyProperty = 10;
    }
}

public interface IPizza<T>
{

}

public class Pizza<T> : IPizza<T>
{

}

public class Pasta
{
    public int MyProperty { get; set; }
}

Будет проверен интерфейс, приведенный к классу во время выполнения.

Infact, если вы используете как тип Pizza<Pasta> вместо IPizza<Pasta>, это даст вам ошибку компиляции:

class Program
{
    static void Main(string[] args)
    {
        Pizza<Pasta> ao = new Pizza<Pasta>();
        ((Pasta)ao).MyProperty = 10;
    }
}
public interface IPizza<T>
{

}

public class Pizza<T> : IPizza<T>
{

}

public class Pasta
{
    public int MyProperty { get; set; }
}
0 голосов
/ 21 января 2020

Я попробовал что-то не слишком полезное, но "правильное" как для C# компилятора, так и для среды выполнения

Я получил свой ответ

    public class Person
    {
        public long Age { get; set; }
    }

    static void Main(string[] args)
    {
        IEnumerable<Person> list;
        list = new Father();
        ((Father)list).Age = 5;
    }

    public class Father : Person, IEnumerable<Person>
    {
        public IEnumerator<Person> GetEnumerator()
        {
            throw new NotImplementedException();
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            throw new NotImplementedException();
        }
    }
}

Пример

...