2017-04-27 11 views
-1

私のコードは、私が今ユニティエンジンを使用していますなぜC#ダウンキャストが常にnullになるのですか?だからここ

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, 

。 このコードを実行すると、 Debug.Log( "メニュー名は" + menu.Name)です。 Debug.Log( "Statイベントはnullです。名前は" + thisSpot.Name)です。どちらも。 なぜですか? メニューはnullではありませんが、ダウンキャスト後にnullになりますか? 私はこの理由を理解していません。意気消沈ヌルになるのはなぜ

ので、このコードでは、私はコード以下の[1]の部分を実行したいのですが、[statEvent]はそう下記のすべてのコードは

(キーワードを続ける)によって呼び出されません 、ヌルされますか?

お願いします。

+0

メニューがあるので、それがnullではない 'それは限り、あなたのコードが示すように、' SpotUIBase'あるとStatEvent'、 'SpotUIBase'拡張または他のクラスやインタフェースを実装していません。 'menu.uiSort'を' StatEvent'にキャストしようとしていますか? – Lithium

+0

ヌルチェックが間違っています。あなたが 'menu.uiSort'にアクセスして、それがヌルかどうかを調べる前に、if(menu!= null)Debug.Log(" Menu name is "+ menu.Name);'。 – bradbury9

+0

したがって、StatEventはSpotUIBaseから継承されます。 public class StatEvent:SpotUIBase { – leegod

答えて

0

私はgoogledして、正しいDowncastメソッドを確認し、構文のためにforeachを変更しました。 解決しました。

ここに変更コードがあります。

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; 
      } 
関連する問題