2

言うまでもありませんが、これが問題です。

    public static T WriteIfNotNull<T>(ManagementObject retObject, string parameter)
    {
        return retObject[parameter] != null ? (T)retObject[parameter] : default(T);
    }

がオブジェクトである場合Tに壊れます。奇妙な部分(少なくとも私にとって)は、そうではなく、実際に指定されたintである場合、それが機能することです。intretObject[parameter]TT

キャストできないと書いてありますT(この場合でもTint

@編集:@dtbここに行きます:

Specified cast is not valid. 
(T)(object)retObject[parameter] Cannot unbox 'retObject[parameter]' as a 'T'    int         

そして値:

パラメータ:"ProcessId"

retObject [パラメータ]:4

default(T):0

@@ Edit:これも電話です

pr.ProcessId = Util.WriteIfNotNull<int>(retObject, "ProcessId");
4

1 に答える 1

2

何が起こっているのかは、retObject[parameter]実際にはではなく、int別の数値型 (通常はプロセス ID の場合) であるように思われます。その場合、実際に値を変更するためにuint使用したいと思います。Convert

return retObject[parameter] != null 
    ? (T)Convert.ChangeType(retObject[parameter], typeof(T)) 
    : default(T);

ここで単純なキャストが機能しない理由は、からobjectintのキャストが実際に boxed である場合にのみ機能するためintです。objectからへの変換キャストがないため、1 回の操作でダウンキャストと変換キャストを行うことはできませんint。したがって、から離れobjectてキャストするには、正確なタイプまたは正確なタイプの有効なスーパータイプ、インターフェースなどにキャストする必要があります。

したがって、boxeduintを anに変換するには、最初にボックス化をint解除するかint(問題あり)、いずれかのConvert方法を使用してタイプを変更する必要があります (上記のように)。

Convert.ChangeType()ボックス化されている場合でも、互換性のあるタイプ間の変換に機能します。たとえば、 ifretObject[parameter]が a を返す場合、これにより oflongに変換できます。 Tint

詳細については、こちらのブログ記事を参照してください。繰り返しますが、要点は、 fromobjectのキャストがダウンキャストであるため (変換キャストは定義されてobjectいません)、正確なタイプ (または有効なサブタイプ) にキャストする必要があることです。

于 2012-11-05T21:59:41.417 に答える