-8

谁能解释一下:

  • 编译确定
  • 运行时 KO

我已经检查了 IEnumerable<> 和 IEnumerable 的源代码,但没有发现任何东西仅供参考,这不适用于 List

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

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

2 回答 2

0

在编译时没有检查接口转换为类。

如您所见,您甚至可以编译它:

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; }
}

转换为类的接口将在运行时进行评估。

事实上,如果你使用 as 类型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; }
}
于 2020-01-21T13:31:36.290 回答
-2

对于 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();
        }
    }
}

例子

于 2020-01-21T13:18:39.353 回答