&引用;作为「;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)。看看@user28470var
并不意味着“未定义”-它意味着“让编译器从声明中推断类型”。在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);