0

私のコードにはこのようなものがあります。現在、メソッドは列挙型を返すと想定されています。ただし、すべてのコード パスが値を返すわけではありません。私はこの問題を解決したいと思います。同時に、デバッガーに、(つまり) else に入った場合に列挙型を返すことができないというアサーション (コードの 3 番目の条件) を警告してもらいたいと考えています。通常、else 条件に別の列挙型を追加して戻り値を確認しますが、これを行うより良い方法があるかどうかを知りたかったのです。

        private enumType AdjustType(someo_object q)
        {
            if(q.val.Equals("M"))
            {
                return enumType.FirstType;
            }
            else if (q.val.Equals("N"))
            {
                return enumType.SecondType;
            }
            else
            {
                return null; //This isnt allowed - I would like something like an assertion here
            }
        }
4

3 に答える 3

2

いくつかのオプションがあります。

  1. 例外をスローします。これは、入力が無効であることがわかっている場合に適しています(たとえば、呼び出し元のコードのバグが原因)。

    throw new InvalidOperationException("Cannot convert from Q to MyEnum.");
    
  2. null許容型を使用します。これは、操作から有効な結果がない場合(たとえば、無効なユーザー入力またはバグではない状況のため)に適切です。

    private MyEnum? AdjustType(object q)
    {
        // ...
        else
            return null;
    }
    
  3. None列挙型に値を追加して、次の値を返します。

    public enum MyEnum
    {
        None = 0,
        First,
        Second
    }
    

(ここで読むことができるように、そのような値を追加することを常にお勧めします。)


メソッドに対して決して有効ではない着信引数の値がある場合は、メソッドの開始時にそれらをチェックしArgumentException、値が無効な場合は、またはその派生クラスの1つをスローする必要があります。次に、メソッドの残りの部分で、入力値が有効であると想定できます。これにより、コードがよりクリーンになります。これは私がそのようなメソッドをプログラムするのが好きな方法です:

private MyEnum AdjustType(object q)
{
    #region Contract
    if (q == null)
        throw new ArgumentNullException("q");
    if (q.Value != "M" && q.Value != "N")
        throw new ArgumentException("Value must be M or N.", "q");
    #endregion

    // Here all incoming arguments are valid and within range.
    // ...
}
于 2013-02-25T20:19:30.003 に答える
2

私はただ投げArgumentExceptionます-そしておそらくスイッチを介してそれを行います:

private enumType AdjustType(someo_object q)
{
    switch (q.val)
    {
        case "M": return enumType.FirstType;
        case "N": return enumType.SecondType;
        default : throw new ArgumentException(...);
    }
}

とにかく何かDebug.Assertを返す必要があり、リリースビルドでアサーションがオフになっているとエラーが伝播する可能性があります。

もう 1 つの方法は、単に aを使用することです。これを伝播Dictionary<string, enumType>させて満足している場合があります。KeyNotFoundException(文脈によって異なります。)

于 2013-02-25T20:16:41.427 に答える
1

列挙型の null 許容バージョンをいつでも使用できます。

private enumType? AdjustType(someo_object q)
于 2013-02-25T20:16:27.740 に答える