C# 从 IEnumerable<T> 强制转换为 T



谁能解释一下:

  • 编译确定
  • 运行时 KO

我已经检查了IEnumerable<>和IEnumerable的源代码,但一无所获 仅供参考,这不适用于列表

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

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

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

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

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

事实上,如果你使用类型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; }
}

我尝试了一些不太有用但对 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();
}
}
}

相关内容

  • 没有找到相关文章

最新更新