2013-08-02 7 views
18

intをnull値のintに変換する方法を知る必要があります。しかし、私はエラーを取得し続ける "バイナリ演算子Equal型 'System.Nullable`1 [System.Int32]'と 'System.Int32'の定義されていません。"任意の解決策。 Microsoft SQL Serverのnull可能なint型である必要があります。このようintをnullable intに変換しますか?

somevalue = Expression.Constant(something.GetValue(some,null).To<Nullable<System.Int32>>()); 

public static T To<T>(this object obj) 
    { 
     Type t = typeof(T); 
     Type u = Nullable.GetUnderlyingType(t); 

     if (u != null) 
     { 
      if (obj == null) 
       return default(T); 

      return (T)Convert.ChangeType(obj, u); 
     } 
     else 
     { 
      return (T)Convert.ChangeType(obj, t); 
     } 
    }' 
+1

'something.GetValue'の戻り値の型は何ですか?あなたがもっと簡単にすべき何かのために多くの仕事をしているようですね... –

+0

エラーはコンパイラエラーかランタイムエラーですか?あなたのメソッドをさまざまな入力で実行しようとしましたが、エラーを受け取ることができませんでした。ランタイム例外が発生した場合は、スタックトレースを提供してください。 –

+0

戻り値の型はintでなければなりません。問題は、私はintを渡すことですか?これはデータベースからの値であり、その関数はintを返すので、intに変換する必要があります。これは、動的なクエリを作成しようとしているためです。また、いくつかの値はvarです! intではない?常にvarでなければならない、これは変更できないので、人々が提案したようにキャストすることはできません。 – user2582770

答えて

22

。あなたがこれをしようとしている方法は、あなたがボックス化された値の型がどのように働くかについて誤解があることを示しています。

このエラーメッセージは、オペランドにnull型int型の式ノードとint型の式ノードを持つ2項演算子式ツリーノードを構築していることを示しています。それは合法ではない。それらは両方ともである必要があります。 null可能int。あなたがしなければならないのは、無効なint式ツリーノードをConvert式ツリーノードにラップして、null可能なintに変換してからをバイナリ演算子式ツリーノードコンストラクタに渡すことです。

、これは間違っているされています

var someIntExpr = Expression.Constant(123, typeof(int)); 
var someNubIntExpr = Expression.Constant(null, typeof(int?)); 
var badEq = Expression.Equal(someIntExpr, someNubIntExpr); 

これは権利である:

var goodEq = Expression.Equal(Expression.Convert(someIntExpr, typeof(int?)), someNubIntExpr); 

、なぜ、あなたは間違って何をやっているのですか?

To<T>というメソッドがあり、Tを返します。 intが正しく入力され、int?が返されます。だから何?その値をExpression.Constantに渡します。この場合、nullable int がボックス化されたintに入っています。あなたはボックス化されたnullable値型のようなものがあると信じていますが、そうではありません! null値の型は、null参照またはボックス化された非nullable値型のいずれかに囲みます。

したがって、あなたはでこの問題を解決することもできます。。手元にあるボックス化されたintを持ち、nullable型の定数式ツリーノードが必要な場合は、の型はとなります。

Expression.Constant(someBoxedIntValue, typeof(int?)) 

完了。だから、:アップラップ、次の2つのソリューションがあります:あなたが手に箱入りint型を持っている場合は、の式ノードを持っている場合

  • を、Constant工場、または
  • にして、必要なNULL可能値の型を渡しますintを手で入力してからConvert式ノードファクトリを使用し、それに目的の型を渡します。

どちらも、正しい型の式ノードを返して、別のnull可能なintと比較します。

+0

お返事ありがとう、私はあなたが正しいかもしれないと思います。しかし、私はどのように私の現在のコードにこれを実装するのか分かりません。多分あなたはこのvarの例を与えることができますか?somevalue = Expression.Constant(something.GetValue(some、null).To >());このコードを変更するだけでいいですか? – user2582770

+0

あなたの天才!出来た! – user2582770

+2

@ user2582770:私は天才ではありませんが、私はそのコードのかなりの部分を書いた人です。あなたはそれを理解してうれしいです。 –

3
int i = 1; 
int? k; 
k = i as int?; 

あなたはNULL可能int型にint型であるiを変換します。)

int?Nullable<int>の短いバージョンです。

4
int test = 0; // set int 

int? num = test; // convert test to a nullable int 

num = null; // set num as null 
16

は通常、あなたはキャストを使用してintint?を変換します。

int? myNullable = (int?) 15; 
int myInt = (int) myNullable; 
2

このような単純な機能は動作しませんか? Toコードがnull非許容型の値を与えられたが、それはこのについて移動するすべての正しい方法でないときに、あなたがNULL可能タイプのConstantを構築しようとしているように思われること

int i; 
int? temp = int.TryParse(<your value>, out i) ? (int?)i : null; 
2

ここに行きます。 null可能なプリミティブなソリューションへの一般的な文字列。

int? n = " 99 ".ToNullable<int>(); 

/// <summary> 
/// Developed by Taylor Love 
/// </summary> 
public static class ToNullableStringExtension 
{ 
    /// <summary> 
    /// <para>More convenient than using T.TryParse(string, out T). 
    /// Works with primitive types, structs, and enums. 
    /// Tries to parse the string to an instance of the type specified. 
    /// If the input cannot be parsed, null will be returned. 
    /// </para> 
    /// <para> 
    /// If the value of the caller is null, null will be returned. 
    /// So if you have "string s = null;" and then you try "s.ToNullable...", 
    /// null will be returned. No null exception will be thrown. 
    /// </para> 
    /// </summary> 
    /// <typeparam name="T"></typeparam> 
    /// <param name="p_self"></param> 
    /// <returns></returns> 
    public static T? ToNullable<T>(this string p_self) where T : struct 
    { 
     if (!string.IsNullOrEmpty(p_self)) 
     { 
      var converter = System.ComponentModel.TypeDescriptor.GetConverter(typeof(T)); 
      if (converter.IsValid(p_self)) return (T)converter.ConvertFromString(p_self); 
      if (typeof(T).IsEnum) { T t; if (Enum.TryParse<T>(p_self, out t)) return t;} 
     } 

     return null; 
    } 

https://github.com/Pangamma/PangammaUtilities-CSharp/tree/master/src/StringExtensions

関連する問題