2011-04-14 36 views
1

我有一個愚蠢但braincracker問題關於鑄造類型。從代碼中可以看到,我有一個變量lprod_monthyreport,取決於ytm值可以是List<Monthly_Report>或簡單地Monthly_Report。我需要變量在兩種情況下都具有相同的名稱。轉換對象T到列表中<T> C#

var lprod_monthlyReport = new List<Monthly_Report>; 

if (ytm == true) 
{ 
    lprod_monthlyReport = _ProductRep.GetSpecificArchiveReport(prod.Prod_ID, lmonth, lyear, item.item_ID); 
} 
else 
    lprod_monthlyReport = _ProductRep.GetSpecificYTMReport(prod.Prod_ID, item.item_ID); 

的問題是,如果我聲明,如果每一個(或其他)段內的變量的編譯器,因爲它說,該變量在這方面已經宣佈給錯誤。

我已經嘗試過鑄造

lprod_monthlyReport = (Monthly_Report) _ProductRep.GetSpecificArchiveReport(prod.Prod_ID, lmonth, lyear, item.Item_ID); 

但它不工作。我也嘗試作爲關鍵字沒有成功。

請幫我用這個嗎?謝謝

弗朗切斯科

+1

GetSpecificArchiveReport和GetSpecificYTMReport是什麼類型返回 – Hath 2011-04-14 12:58:36

+0

爲什麼'lprod_monthlyReport' **有**要成爲'List ',而不是你的方法返回什麼? – 2011-04-14 13:01:07

+0

@Hath:謝謝你的回答。 ** GetSpecificArchiveReport **返回** Monthly_Report **對象(它使用** Single **進行LINQ查詢)** GetSpecificYTMReport **返回**列表 **(使用**的LINQ查詢** ** )。 – CiccioMiami 2011-04-14 13:03:11

回答

3

這應該工作: 如果你已經有了一個Monthly_Report只需將其添加到列表...

List<Monthly_Report> lprod_monthlyReport; 
    if (ytm == true) 
    { 
     lprod_monthlyReport = new List<Monthly_Report>(); 
     lprod_monthlyReport.add(_ProductRep.GetSpecificArchiveReport(prod.Prod_ID, lmonth, lyear, item.item_ID)); 
    } 
    else{ 
     lprod_monthlyReport = _ProductRep.GetSpecificYTMReport(prod.Prod_ID, item.item_ID)); 
    } 
+0

Genious,這就是我一直在尋找!非常感謝。其實我想做一個小小的改進。您可以在開頭聲明** var lprod_monthlyReport = new List (); **並從** if if塊中取出。否則,** else **塊將不起作用 – CiccioMiami 2011-04-14 13:13:34

+0

@Francesco:如果您從'GetSpecificYTMReport()'獲得'List ',爲什麼它不工作? – 2011-04-14 13:21:42

+0

原諒它的工作原理。你能否解釋一下爲什麼你在if中聲明對象而不是聲明它時?不能編譯的 – CiccioMiami 2011-04-14 13:25:28

0

這不會工作,唉。

但是,如果您願意,您可以將單個實例包裝到列表中。那麼你只需要讓你的代碼處理一個或多個Monthly_Report項目的List<Monthly_Report>

2

的代碼

var lprod_monthlyReport = new List<Monthly_Report>; 

第一行意味着該變量是List<Monthly_Report>類型的,因此它不能包含單個Monthly_Report對象。

該代碼應重構爲不同的工作方式或使該方法返回一個List<Monthly_Report>,其中只有一個Monthly_Report

+0

謝謝你的回答。注意這兩種方法是不同的。一個返回一個**列表 **另一個** Monthly_Report ** – CiccioMiami 2011-04-14 13:07:17

1

有關var關鍵字重要的是,這並不意味着「變種」 。 var用於類型推理編譯器,這意味着,你聲明:

var something = new List<Something>(); 

...您聲明的東西是List<Something>類型。這意味着你不能這樣做:

something = new Something(); 

...因爲你已經宣佈它爲別的東西。從可用性的角度來看,var是句法糖。編譯器(和Visual Studio intellisense引擎)正在使用類型推斷來知道something實際上是List<Something>

0

嘗試此

List<Monthly_Report> lprod_monthlyReport; 

if (ytm == true) 
{ 
    lprod_monthlyReport = _ProductRep.GetSpecificArchiveReport(prod.Prod_ID, lmonth, lyear, item.item_ID); 
} 
else 
{ 
    lprod_monthlyReport = new List<Monthly_Report>() 
    { 
     _ProductRep.GetSpecificYTMReport(prod.Prod_ID, item.item_ID) 
    }; 
} 
+1

,你以後不能指定'var'的類型。 – Jodrell 2011-04-14 13:08:50

+0

感謝您的回答。但是,你不能在不做任務的情況下聲明一個var變量。 – CiccioMiami 2011-04-14 13:12:27

+0

當! firefox何時會爲我做語法檢查! :)編輯 – dkackman 2011-04-14 13:12:40

0

聲明lprod_monthlyReport作爲 '對象'。Monthly_ReportList<Monthly_Report>之間沒有is關係。

當你使用'lprod_monthlyReport'時你會遇到問題,因爲除了object之外你不知道它是什麼類型,'is'關鍵字可以幫助你。

考慮一下,並考慮重構您的代碼。

+0

不適用,因爲那麼我需要查詢變量。如果我將它們聲明爲對象,編譯器將無法找到查詢方法 – CiccioMiami 2011-04-14 13:21:13