Подтвердить что ты не робот

Конвертировать int в nullable int?

Мне нужно знать, как преобразовать int в nullable int. Тем не менее, я продолжаю получать ошибку "Бинарный оператор Equal не определен для типов" System.Nullable`1 [System.Int32] "и" System.Int32 "." Любое решение. Это должен быть тип NULL-типа Microsoft SQL Server.

 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);
        }
    }'
4b9b3361

Ответ 1

Этот код To, кажется, вы пытаетесь построить Constant типа с нулевым значением, если задано значение типа, не имеющего значения NULL, но это не совсем правильно, как это сделать. Способ, которым вы пытаетесь это сделать, указывает на то, что у вас есть недоразумение о том, как работают типы полей в коробке.

Это сообщение об ошибке указывает, что вы создаете дерево выражений двоичного оператора node, у которого в качестве своих операндов есть выражение node типа NULL int и выражение node типа int. Это не законно; они должны быть как обнуляемыми int. То, что вам нужно сделать, - это обернуть дерево выражений с наименьшим значением для node в дереве выражений Convert node, которое преобразует его в nullable int, а затем передает это бинарному оператору конструктор выражений node.

То есть это неправильно:

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, а затем делает константу из этого. Вы считаете, что существует такая вещь, как тип нулевых значений с нулевым значением, но нет! Нулевым типом значения присваивается либо нулевая ссылка, либо тип поля с нулевым значением.

Таким образом, вы также можете решить свою проблему , не делая ничего из этого безумного материала в первую очередь. Если у вас есть встроенный пакет, и вам нужно дерево констант node типа NULL, просто укажите тип.

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

Готово. Итак: завершая работу, у вас есть два решения:

  • Если у вас есть пакет в штучной упаковке, передайте его и тип значения NULL, который вы хотите использовать для Constant factory, или
  • если у вас есть выражение node типа int в руке, используйте выражение Convert node factory и передайте ему и желаемый тип.

Оба вернут вам выражение node правильного типа, которое будет сравниваться с другим значением NULL.

Ответ 2

Как правило, вы конвертируете int a int? с помощью трансляции.

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

Ответ 3

int test = 0; // set int

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

num = null; // set num as null

Ответ 4

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

Подобным образом вы преобразуете i, который является int в nullable int;)

int? - короткая версия Nullable<int>.

Ответ 5

Не работает ли что-то более простое?

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

Ответ 6

Здесь вы идете. Общая строка для примитивного решения с нулевым значением.

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