7

objectanを型に変換しようとしていますが、 and型boolに変換したいと考えています。また、可能な場合は適切なキャストを確実に行いたいと考えています。だから私は次のコードを持っています:boolNullable<bool>

if (value is bool)
{
    boolValue = (bool) value;
}
else if (value is bool? && ((bool?)value).HasValue)
{
    boolValue = ((bool?) value).Value;
}
else
{
    throw new ArgumentException("Value must be a boolean type");
}

ReSharper 2016 はvalue is bool?、この if ステートメントのスタックで常に false と評価されることを通知します。何故ですか?それは、それがNullable<bool>から継承しないobject(不可能)かvalue is boolbool?.

ReSharper 2016 にバグがある可能性もあります。の実装System.Windows.Controls.BooleanToVisibilityConverter.Convertはほとんど同じであることがわかります。WPFコアにそのような間違いがあるとは思えないので、ReSharperの問題だと思います。

4

1 に答える 1

9

値型objectboxedのまま格納されている場合。のボクシングNullable<T>特別な扱いを受ける:

null 許容型に基づくオブジェクトは、オブジェクトが null でない場合にのみボックス化されます。HasValue が false の場合、オブジェクト参照はボックス化ではなく null に割り当てられます。null 以外の null 許容値型をボックス化すると、値型をラップする System.Nullable ではなく、値型自体がボックス化されます。

そして、のドキュメントisごとに:

指定された式がnull 以外の場合、 is 式は true と評価され、例外をスローすることなく、指定されたオブジェクトを指定された型にキャストできます。

したがって、これらの両方を使用して、null の場合を推測できます ( fiddleを参照)。

bool? x = null;
object obj = x;   // assigns obj = null
obj is bool?      // false, obj is null
obj is bool       // false, obj is null

null 以外の場合:

bool? x = true;
object obj =  x;  // obj is boxed bool (true)
obj is bool?      // true, obj unboxes to bool?
obj is bool       // true, obj unboxes to bool

したがって、ReSharper は正しいです。最初のブランチは、またはであるかのように評価されtrueます(オブジェクトvaluetrueorfalseから割り当てられたものであるか、bool関連bool?性がないか、または認識されていないかどうか)。2 番目のブランチは常にfalseこの場合になります。

于 2016-05-28T07:59:26.283 に答える