C# 为什么用as代替cast工作?

C# 为什么用as代替cast工作?,c#,generics,casting,C#,Generics,Casting,我有两个类,第一个类引用第二个类。我的问题是,为什么在第二个类中,行cl.container=this作为ClassContainer可以工作,显式castcl.container=(ClassContainer)可以工作没有 class MyClass { public ClassContainer<MyClass> container { get; set; } } class-MyClass { 公共类容器容器{get;set;} } 二等舱: class Clas

我有两个类,第一个类引用第二个类。我的问题是,为什么在第二个类中,行
cl.container=this作为ClassContainer可以工作,显式cast
cl.container=(ClassContainer)可以工作没有

class MyClass
{
    public ClassContainer<MyClass> container { get; set; }
}
class-MyClass
{
公共类容器容器{get;set;}
}
二等舱:

class ClassContainer<T> where T : MyClass
{
    public ClassContainer()
    {
        MyClass cl = new MyClass();
        cl.container = this as ClassContainer<MyClass>; // works
        cl.container = (ClassContainer<MyClass>)this;   // does not work
    }
}
class类容器,其中T:MyClass
{
公共类容器()
{
MyClass cl=新的MyClass();
cl.container=此为ClassContainer;//有效
cl.container=(ClassContainer)this;//不工作
}
}

这是因为
as
是安全强制转换,即如果无法强制转换类型,则不会引发异常或编译器错误。它只会返回
null
c1。使用
as
后,容器
应为
null


从代码中,您可能试图使用变体泛型。查看以帮助实现您试图做的事情。你会,也不能使类型参数同时变为协变和逆变。

当你说“不工作”时,它会抛出错误吗?@prtdomingo不会compile@KevinWallis在这里寻找答案:cl.container在运行his时不是空的code@MaksimSimkin尝试使用派生类
MyClass
作为类型参数<代码>c1。容器
肯定为空。