4

重複の可能性:
Nullable<value> 型を使用した条件付き演算子の割り当て?

関数が null 許容整数「int?」を返すときに、条件演算子「?:」がここで機能しないのはなぜですか? 「return null」は機能しますが、「?:」ではまず「null」を「(int?)」にキャストする必要があります。

    public int? IsLongName(string name) {

        int length = name.Length;

        // this works without problems
        if (name.Length > 10) {
            return null;
        } else {
            return name.Length;
        }

        // this reports: 
        // Type of conditional expression cannot be determined because 
        // there is no implicit conversion between '<null>' and 'int'
        return name.Length > 10 ? null : name.Length;
    }
4

4 に答える 4

5

最後の行を次のように変更してみてください。

return name.Length > 10 ? null : (int?)name.Length;

コンパイラは、?: 演算子の戻り値の型を理解できません。null と int という競合する値があります。int を nullable にキャストすることで、コンパイラは戻り値の型が nullable int であり、null も受け入れられることを理解できます。

于 2012-04-21T17:25:42.227 に答える
1

null値と値の両方をint暗黙的にint?データ型に変換できますが、それ自体のリテラルは、指定nullしない限りコンパイラには認識されobjectません。objectと の両方にint暗黙的に変換できる共通のデータ型はありません。これは、コンパイラが不満を言っていることです。

Yorye が言うように、inttoint?をキャストして、コンパイラに変換を行わせることができます。nullまたは、 toをキャストすることもできますint?。これにより、コンパイル済みで to からの暗黙的な変換を使用できるようになりintますint?

于 2012-04-21T17:30:03.080 に答える
0

演算子の両方の条件は、?:暗黙的に互換性がある必要があります。intになることはあり得ないnullため、コンパイル時エラーが発生します (同様に、null決してなることができませんint)。キャストする必要があります。三項を使用してそれを回避する方法はありません。

コンパイラは、メソッドが特定のパスからの戻り値の型に互換性のある値を返すことのみをチェックし、特定の出口点からの戻り値が暗黙的に別のブロックの戻り値と互換性があります。

于 2012-04-21T17:34:17.413 に答える
0

?:演算子は、2 つの可能な戻り値の型のみを考慮します結果を受け取る変数の型は認識されません (実際、より複雑な式では、明示的な変数が存在しない場合があります)。

これらの戻り値の 1 つが の場合、型情報はありません。他の戻り値の型を確認し、変換が存在するかどうかを確認するnullことしかできません。

あなたの場合、nulltype の戻り値がありintます。利用可能な変換はありません。への変換がありますがint?、それは考慮されている可能な戻り値の型ではありません?:

于 2012-04-21T17:36:08.873 に答える