2017-08-18 10 views
-1

私は別のクラスには、アレイは、クラスが読み込まれ、次のような方法によって返される追加Countが共に0

public class InternalTag_RelatedObjectsViewModel 
{ 
    public Guid[] BranchIDS { get; set; } 
    public Guid[] CompanyIDS { get; set; } 
    public Guid[] ContactIDS { get; set; } 
    public Guid[] DivisionIDS { get; set; } 
    public Guid[] TenderIDS { get; set; } 
    public Guid[] ProjectIDS { get; set; } 
    public Guid[] DocumentIDS { get; set; } 
    public Guid[] NewsIDS { get; set; } 
    public Guid[] PhotosIDS { get; set; }   

    public int Total 
    { 
     get 
     {        
      return (this.BranchIDS?.Count() ?? 0 + this.CompanyIDS?.Count() ?? 0 + this.ContactIDS?.Count() ?? 0 + this.DivisionIDS?.Count() ?? 0 + this.TenderIDS?.Count() ?? 0 + this.ProjectIDS?.Count() ?? 0 + this.DocumentIDS?.Count() ?? 0 + this.NewsIDS?.Count() ?? 0 + this.PhotosIDS?.Count() ?? 0);     
     } 
    } 
} 

取り込まれる次のクラスを有する返し

static void Main(string[] args) 
    { 
     InternalTag_RelatedObjectsViewModel test = new InternalTag_RelatedObjectsViewModel() 
     { 
      CompanyIDS = new Guid[] { Guid.NewGuid() }, 
      NewsIDS = new Guid[] { Guid.NewGuid(), Guid.NewGuid() } 
     }; 

     Console.Write(test.Total); 
    } 

しかしTotalは0を返します。配列の一部にデータがある場合でも。 何か不足していますか?

+0

私の悪い誤字は常に0を返します – R2D2

+2

[mcve]を入力してください。問題を再現できるときは、あなたを助けるほうが簡単です。私はそれが優先順位の問題だと思うが、私は現時点でそれを再現することに問題がある。 –

+0

配列を初期化すると、総数が返されることがあります。 –

答えて

5

あなたが優先され行方不明に計算される方法を変更します。

それは、これは最低限の例に減少したときに何が起こっているのか確認するために簡単です:

using System; 

public class Program 
{ 
    public static void Main() 
    { 
     string[] a = { "x", "y" }; 
     string[] b = { "x" }; 

     int first = a?.Length ?? 0 + b?.Length ?? 0; 
     int second = (a?.Length ?? 0) + (b?.Length ?? 0); 
     Console.WriteLine(first); // Prints 2 
     Console.WriteLine(second); // Prints 3 
    } 
} 

明らか3は、ここでは正しい答えです。どうしたの?

??オペレータはので、ここでfirstがに相当し、+よりも低い優先順位を持っている:ステップ1の結果が非NULLであったため

int? step1 = a?.Length;    // 2 
int? step2 = step1 ?? (0 + b?.Length); // 2 
int first = step2 ?? 0; 

注意をどのように:それを分割する

int first = ((a?.Length ?? (0 + b?.Length)) ?? 0; 

、我々はbの長さを取ることは決してありません。

だけで、各NULL可能な長さの表現の結果に??オペレータを適用したいあなた、そう(a?.Length ?? 0)周りのブラケットはあなたがやりたいです。

0

@VDNはこの回答を掲載して削除しましたが、問題は解決しました。

合計は基本的には、以下の固定私の問題

public int Total 
    { 
     get 
     {        
      return ((this.BranchIDS?.Count() ?? 0) + (this.CompanyIDS?.Count() ?? 0) + (this.ContactIDS?.Count() ?? 0) + (this.DivisionIDS?.Count() ?? 0) + (this.TenderIDS?.Count() ?? 0) + (this.ProjectIDS?.Count() ?? 0) + (this.DocumentIDS?.Count() ?? 0) + (this.NewsIDS?.Count() ?? 0) + (this.PhotosIDS?.Count() ?? 0));     
     } 
    } 
+2

それは必要ではないでしょう。実際に[mcve]を提供できるのであれば、間違ったことを解決するのに役立ちます。 –

+0

クラスの移植方法を追加しました – R2D2

+0

@JonSkeet、角括弧を追加する必要があります。それ以外の場合、方程式は最初の非NULL配列の長さだけを返します。おそらく '? '演算子のせいでしょうか? – Sinatr

関連する問題