2014-09-26 19 views
0

如何在使用關鍵字「as」時將基類數據獲取到子類對象中。我嘗試了下面的代碼,但它返回空數據。「as」關鍵字在c#中返回空數據

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

由於您創建的純粹的'Basec'不是'DerivedC',所以'as'將返回'null,因爲它不能被轉換。在C#中不允許向下轉換。你想達到什麼目的? – 2014-09-26 14:02:47

+0

一個'BaseC'對象並不總是一個'DerivedC'對象(另一種方式是)。您只創建了一個「BaseC」對象而不是「DerivedC」對象。你試圖做一個縮小的演員(BaseC到DerivedC),而只有一個擴展演員才能工作(DerivedC到BaseC)。 – Styxxy 2014-09-26 14:04:03

+0

派生的C繼承自BaseC,並且您想將BaseC視爲DeviedC ...查看問題?另外,爲什麼使用var? var是一個未定義的類型,例如在linq中使用它 – user28470 2014-09-26 14:04:55

回答

3

這是行不通的。將BaseC替換爲AnimalDerivedCCow,您將看到原因。

運行時無法從Animal實例創建Cow,因爲缺少信息。這將工作:

BaseC baseC = new DerivedC(); 

因爲實例實際上是一個DerivedC

+6

等等,你是不是說每個動物都是牛? :o – Davio 2014-09-26 14:06:02

0

baseC不是DerivedC的實例,所以as運營商將始終返回null

但是它的工作,如果你改變了Main這個第一行:

BaseC baseC = new DerivedC(); 
4

這是正確的 behaivour:

你的代碼(簡化):

BaseC baseC = new BaseC(); 

// null: result is a BaseC instance and not DerivedC one 
DerivedC result = baseC as DerivedC; 

反向代碼(可能是你期望看到的):

BaseC baseC = new DerivedC(); // <- Now, DerivedC instance created 

// not null: result is in fact a DerivedC instance: new DerivedC() 
DerivedC result = baseC as DerivedC; 

// not null: DerivedC is inherired from BaseC 
// and that's why any DerivedC instances are BaseC instances as well 
BaseC result2 = baseC as BaseC; 
0

至於實際的解決方案(也許你已經這樣做,你嘗試了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); 

至少,減少了重複代碼,這樣你就不會手動在多個地方分配值。