2

これはかなり単純な方法です。私はentity frameworkいくつかのデータを取得してから、if statement. ただし、現在、メソッドは赤でマークされています。

これは私の方法です:

private bool IsSoleInProduction(long? shoeLastID)
{
    if (shoeLastID == null)
    {
        MessageBox.Show(Resources.ERROR_SAVE, 
                        "Error", 
                        MessageBoxButtons.OK, 
                        MessageBoxIcon.Error);
        return false;
    }

    ISoleService soleService = 
        UnityDependencyResolver.Instance.GetService<ISoleService>();

    List<Sole> entity = 
        soleService.All().Where(s => s.ShoeLastID == shoeLastID).ToList();

    if (entity.Count() != 0)
    {
        foreach (var items in entity)
        {
            if (items.Status == 20)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }
    else
    {
        return false;
    }    
}

私は何が欠けていますか?

4

9 に答える 9

3

コレクションにアイテムがない場合entity、含まれている if/else ブランチは実行されません。この場合、return ステートメントはもうありません。これは、そのelse部分が実行されず、外部にforeachreturn ステートメントがないためです。

于 2013-04-09T07:01:54.317 に答える
3

コンパイラはそれを「認識」しません

entity.Count() != 0

それからあなたのループ

foreach (var items in entity)

少なくとも 1 回は実行されます。したがって、ブロックforechを実行せずにゼロ回を実行する可能性があります。else

entityが最初にenumeratedであると仮定すると、いくつかの (有限数の) 項目が生成されます。その場合、Countは非ゼロになります。次に、同じものentityが列挙されときに、アイテムが生成されないとします。これにより、コードが返されずに「フォールスルー」する可能性があります。

ソースが再列挙されるたびに同じ数のアイテムが生成されることを保証できる可能性が非常に高いです。しかし、コンパイラはできません。

解決策: スキップif (entity.Count() != 0)してforeachすぐに実行してください。

于 2013-04-09T07:15:44.557 に答える
2

このコード ブロックから何も再実行していません

if (entity.Count() != 0)
            {
                foreach (var items in entity)
                {
                    if (items.Status == 20)
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
                // return someting
            }
于 2013-04-09T07:02:41.070 に答える
1

次のことを検討してください。これは、「単一の出口点」の原則 (コードの明確さを改善するのに役立つ場合があります) に準拠し、いずれの場合でもデフォルト値を確保します。

private bool IsSoleInProduction(long? shoeLastID)
{
    // The main change: A default value, assuming "no":
    var isSoleInProduction = false; 

    if (shoeLastID == null)
    {
        MessageBox.Show(Resources.ERROR_SAVE, 
                        "Error", 
                        MessageBoxButtons.OK, 
                        MessageBoxIcon.Error);
        isSoleInProduction = false;
    }

    ISoleService soleService = 
        UnityDependencyResolver.Instance.GetService<ISoleService>();

    List<Sole> entity = 
        soleService.All().Where(s => s.ShoeLastID == shoeLastID).ToList();

    if (entity.Count() != 0)
    {
        foreach (var items in entity)
        {
            if (items.Status == 20)
            {
                isSoleInProduction = true;
            }
            else
            {
                isSoleInProduction = false;
            }
        }
    }
    else
    {
        isSoleInProduction = false;
    }    

    return isSoleInProduction;
}
于 2013-04-09T07:14:52.707 に答える
1

あなたのentity.Count()ないもの0とあなたのentityないものは何itemsですか?

つまり、ifブロックは機能しますが、foreach一部は機能しません。ifパーツには return ステートメントがないため、エラーが発生します。

ifreturnステートメントを自分の部分に入れる必要があります。

if (entity.Count() != 0)
{
    foreach (var items in entity)
    {
        if (items.Status == 20)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    //return true or false
}
于 2013-04-09T07:10:41.953 に答える
0

エラーが示すように、return 句が評価されない場合があります (たとえば、リストに要素がない場合)。これをすばやく解決するには、たとえば最後のreturn句をステートメントの外に移動するなどして、デフォルトの return ステートメントを配置しますelse。しかし、実際には、期待する動作に依存します。

 private bool IsSoleInProduction(long? shoeLastID)
        {
            if (shoeLastID == null)
            {
                MessageBox.Show(Resources.ERROR_SAVE, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
            ISoleService soleService = UnityDependencyResolver.Instance.GetService<ISoleService>();
            List<Sole> entity = soleService.All().Where(s => s.ShoeLastID == shoeLastID).ToList();

            if (entity.Count() != 0)
            {
                foreach (var items in entity)
                {
                    if (items.Status == 20)
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
            }
            return false;
        }
于 2013-04-09T07:05:51.610 に答える
0

エンティティ コレクションに要素がない場合、return ステートメントに到達しません。たとえば、最後のステートメントとして return false を追加する必要があります。

于 2013-04-09T07:04:27.017 に答える
0

コンパイラは、 への最初の呼び出しが少なくとも 1 回ループCountすることを意味することを保証できません (必要に応じて、これが正しくないコレクションを作成できるため、正当な理由があります)。foreach代わりにこれを行うことができます (outer は必要ありませんif):

foreach (var items in entity)
{
    if (items.Status == 20)
    {
        return true;
    }
    else
    {
        return false;
    }
}

return false;
于 2013-04-09T07:07:14.163 に答える