1. ホーム
  2. c#

[解決済み] System.Int32' から 'System.Nullable`1[[System.Int32, mscorlib]] へのキャストが無効です。

2023-04-29 22:12:11

質問

Type t = typeof(int?); //will get this dynamically
object val = 5; //will get this dynamically
object nVal = Convert.ChangeType(val, t);//getting exception here

上記のコードでInvalidCastExceptionが発生します。上記の場合、私は単に書くことができました int? nVal = val と書けばいいのですが、上記のコードは動的に実行されています。

オブジェクトにラップされた値(int、floatなどのnullableでない型)を取得し、それを別の型にキャストして別のオブジェクトに保存する必要があります(その型はnullableであるかないかに関わらず、nullableバージョンです)。このとき

System.Int32' から 'System.Nullable`1[[System.Int32.Nullable`1]] へのキャストは無効です。 mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]'.

An int は、以下のように変換/タイプキャスト可能であるべきです。 nullable int に変換できるはずですが、何が問題なのでしょうか?

どのように解決するのですか?

この場合 Nullable.GetUnderlyingType の基本型を取得するために Nullable .

の制限を克服するために私が使っている方法です。 ChangeType に対して Nullable

public static T ChangeType<T>(object value) 
{
   var t = typeof(T);

   if (t.IsGenericType && t.GetGenericTypeDefinition().Equals(typeof(Nullable<>))) 
   {
       if (value == null) 
       { 
           return default(T); 
       }

       t = Nullable.GetUnderlyingType(t);
   }

   return (T)Convert.ChangeType(value, t);
}

非汎用メソッドです。

public static object ChangeType(object value, Type conversion) 
{
   var t = conversion;

   if (t.IsGenericType && t.GetGenericTypeDefinition().Equals(typeof(Nullable<>))) 
   {
       if (value == null) 
       { 
           return null; 
       }

       t = Nullable.GetUnderlyingType(t);
   }

   return Convert.ChangeType(value, t);
}