&引用;作为「;c#中的关键字返回空数据

&引用;作为「;c#中的关键字返回空数据,c#,null,C#,Null,使用关键字as时,如何将基类数据放入子类对象中。我尝试了下面的代码,但它返回null数据 class BaseC { public int BaseId { get; set; } public string BaseName { get; set; } } class DerivedC: BaseC { public int DerivedId { get; set; } public string DerivedName { get; set; } } cl

使用关键字
as
时,如何将基类数据放入子类对象中。我尝试了下面的代码,但它返回
null
数据

class BaseC
{
    public int BaseId { get; set; }
    public string BaseName { get; set; }
}

class DerivedC: BaseC
{
    public int DerivedId { get; set; }
    public string DerivedName { get; set; }
}
class Program
{
    static void Main(string[] args)
    {

        BaseC baseC = new BaseC();
        baseC.BaseId = 1;
        baseC.BaseName = "base class name ";
        var derivedC = baseC as DerivedC;
    }
}

这行不通。将
BaseC
替换为
Animal
并将
DerivedC
替换为
Cow
,您将看到原因

运行时无法从
Animal
的实例创建
Cow
,因为缺少信息。这将有助于:

BaseC baseC = new DerivedC();

由于实例实际上是一个
DerivedC

baseC
不是
DerivedC
的实例,因此
as
运算符将始终返回
null

但是,如果将
Main
的第一行更改为:

BaseC baseC = new DerivedC();
这是正确的作为行为:

您的代码(简化):

反向代码(可能是您期望看到的):


BaseC BaseC=new DerivedC();// 至于一个实用的解决方案(也许您在尝试使用
As
关键字之前就已经这样做了,但我想我会把它扔到那里):

如果所有可用的都是基实例(并且由于某种原因无法更改),并且要填充派生实例,则可以考虑将接受基类的构造函数添加为参数:

class DerivedC : BaseC
{
    public DerivedC() {}  // req'd so you can still create an instance without a BaseC

    public DerivedC(BaseC baseC)
    {
        BaseId = baseC.BaseId;
        BaseName = baseC.BaseName;
    }

    public int DerivedId { get; set; }
    public string DerivedName { get; set; }
}
那么就这样称呼它:

var derivedC = new DerivedC(baseC);

至少这减少了代码重复,因此您不需要在多个位置手动赋值。

因为您创建的纯
Basec
不是
DerivedC
所以
as
将返回`null,因为它无法强制转换。C#中不允许向下投射。你想实现什么?一个
BaseC
对象并不总是一个
DerivedC
对象(反之亦然)。您只创建了一个
BaseC
对象,而不是
DerivedC
对象。您尝试进行缩小转换(BaseC到DerivedC),而只有扩大转换才有效(DerivedC到BaseC)。看看@user28470
var
并不意味着“未定义”-它意味着“让编译器从声明中推断类型”。在Linq之外使用是非常好的。在这种情况下,编译器将使用
DerivedC
作为推断类型。@user28470否,“undefined”表示“我可以用它做任何事情”,这不是
var
的意思-因此不能说
var x=1;x=“一”x
int
,而不是
字符串或“变体”。等等,你是说不是每只动物都是牛O
class DerivedC : BaseC
{
    public DerivedC() {}  // req'd so you can still create an instance without a BaseC

    public DerivedC(BaseC baseC)
    {
        BaseId = baseC.BaseId;
        BaseName = baseC.BaseName;
    }

    public int DerivedId { get; set; }
    public string DerivedName { get; set; }
}
var derivedC = new DerivedC(baseC);