2017-04-27 1 views
-1

Donc, voici mon code,Pourquoi le downcast C# devient-il toujours nul?

public void CheckStatChal()  
{ 
    foreach (SpotUIBase menu in thisSpot.ownMenus) 
    { 
     if (menu.uiSort == SpotUISort.StatEvent) 
     { 
      if(menu != null) 
       Debug.Log("Menu name is "+menu.Name); 
      var statEvent = menu as StatEvent; 
      if (statEvent == null) 
      { 
       Debug.Log("Stat event is null, name is "+thisSpot.Name); 
       continue; 
      } 
      .......... [1] 

public SpecialSpotClass thisSpot; 
public abstract class SpecialSpotClass 
{ 
public List<SpotUIBase> ownMenus = new List<SpotUIBase>(); 
.... 
public class SpotUIBase 
{ 
    public SpotUISort uiSort; 
    .... 
public class StatEvent : SpotUIBase 
{ 
    .... 
public enum SpotUISort{ 
    Inn, Shop, Bar, 

J'utilise le moteur Unity maintenant. Donc, si exécuté ce code, j'ai Debug.Log ("Nom de menu est" + menu.Name); et Debug.Log ("l'événement Stat est nul, le nom est" + thisSpot.Name); tous les deux. Pourquoi? menu n'est pas nul, mais après l'avoir descendu, il devient nul? Je ne comprends pas pourquoi.

Donc, dans ce code, je veux exécuter [1] partie ci-dessous les codes, mais [statEvent] est nulle, donc tout le code ci-dessous ne pas appelé par (continuer mot-clé)

Pourquoi baissés deviennent nuls?

Aide s'il vous plaît.

+0

Il est nul parce que le menu est pas un 'StatEvent' est un' SpotUIBase' et, dans la mesure où vos émissions de code, un 'SpotUIBase' ne couvre pas ou mettre en œuvre toute autre classe ou interface. Est-ce que vous essayez de lancer 'menu.uiSort' en' StatEvent'? – Lithium

+0

vous avez vos vérifications nuls faux. Vous accédez à 'menu.uiSort' avant de vérifier si c'est null' if (menu! = Null) Debug.Log ("Nom du menu est" + menu.Name); '. – bradbury9

+0

Donc StatEvent est hérité de SpotUIBase .. public class StatEvent: SpotUIBase { – leegod

Répondre

0

J'ai donc googlé et confirmé la méthode Downcast, et j'ai changé pour chaque syntaxe. Et résolu.

Ici, le code a changé.

for (int i = 0; i < thisSpot.ownMenus.Count; i++) 
    { 
     if (thisSpot.ownMenus[i].uiSort == SpotUISort.StatEvent) 
     { 
      thisSpot.ownMenus[i] = SpotUI.Instance.StatEvent; 
      var ownMenu = (StatEvent) thisSpot.ownMenus[i]; 
      Debug.Log("own menu is "+ownMenu.Name); 
      if ((!ownMenu.StatChal1.nowCoolTime && ownMenu.StatChal1 != null) 
              || ownMenu.StatChal1 == null) 
      { 
       StatChallenge.Instance.MakeStatChal(this, ref ownMenu.StatChal1); 
       Debug.Log(ownMenu.StatChal1.Name); 
       ownMenu.SetChalInfo(ownMenu.StatChal1, 1); 
       chal1 = ownMenu.StatChal1; 
      }