Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / BV -> C# / 15 сообщений из 15, страница 1 из 1
04.06.2014, 16:17
    #38661632
BV -> C#
Доброе время суток, гуру!

Помогите написать аналог функции на C#:

Код: vbnet
1.
2.
3.
Function Nullif(expression1 As Variant, expression2 As Variant)
  If expression1 = expression2 Then Nullif = Null Else Nullif = expression1
End Function



Модератор: Учимся использовать тэги оформления кода - FAQ
...
Рейтинг: 0 / 0
04.06.2014, 16:43
    #38661667
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BV -> C#
Код: c#
1.
2.
3.
4.
public static T NullIf<T>(T expression1, T expression2) {
  if (expression1 == null || expression2 == null) return null
  return expression1.Equals(expression2) ? null : expression1
}



не проверял
...
Рейтинг: 0 / 0
04.06.2014, 17:43
    #38661755
BV -> C#
Студия ругается - Т не может возвратить null... (((
...
Рейтинг: 0 / 0
04.06.2014, 17:53
    #38661771
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BV -> C#
вместо "? null" написать "? DBNull.Value"
...
Рейтинг: 0 / 0
04.06.2014, 18:10
    #38661800
BV -> C#
Antonariy,
Cannot convert expression type DBNull.Value to return type 'T' - вот такая вот печаль(((
...
Рейтинг: 0 / 0
04.06.2014, 18:15
    #38661806
капитанская дочка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BV -> C#
Shocker.Pro
Код: c#
1.
2.
3.
4.
public static T NullIf<T>(T expression1, T expression2) {
  if (expression1 == null || expression2 == null) return null
  return expression1.Equals(expression2) ? null : expression1
}



не проверял

зря, generic типы могут оказаться не nullable, вряд ли студия разрешить компилить, тогда уж default(T) вместо null, да и зачем городить огороды из условий, когда есть && (AndAlso) или || (OrAlso)? Тогда уж как-то так:

Код: c#
1.
2.
3.
4.
        public static T NullIf2<T>(T expression1, T expression2)
        {
            return expression1 != null && expression2 != null && !expression1.Equals(expression2) ? expression1 : default(T);
        }
...
Рейтинг: 0 / 0
04.06.2014, 18:30
    #38661822
BV -> C#
капитанская дочка,
Да, примерно так, но этот метод на с# не вернет DataTime. На Visual Basic метод возвращает тип аргументов.
...
Рейтинг: 0 / 0
04.06.2014, 18:34
    #38661828
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BV -> C#
C чего вдруг не вернет?
Код: c#
1.
public static T NullIf2<T>(T expression1, T expression2)
...
Рейтинг: 0 / 0
04.06.2014, 18:36
    #38661831
капитанская дочка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BV -> C#
Павел Зигмундовичкапитанская дочка,
Да, примерно так, но этот метод на с# не вернет DataTime. На Visual Basic метод возвращает тип аргументов.

это шутка?
...
Рейтинг: 0 / 0
05.06.2014, 00:17
    #38662045
iMrTidy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BV -> C#
Павел Зигмундович,

Возможно пригодится такой вариант:

Код: c#
1.
Func<object, object, object> NullIf = (t1, t2) => t1 != null && t2 != null && !t1.Equals(t2) ? t1 : null;



В случае равенства будет возвращаться реальный null, а также здесь имеет место быть Boxing/Unboxing.
...
Рейтинг: 0 / 0
06.06.2014, 11:29
    #38663330
BV -> C#
Все варианты не работают, поскольку на VB функция NullIf используется возврата разных типов данных, например:
- если она вызывается как аргумент DataTime для функции, она и вернет результат сравнения 2х DateTime;
- если она вызывается как аргумент String для функции, она и вернет результат сравнения 2х String;
И так для всех типов данных.
Не получается ее реализовать на С#. Может есть другие варианты?
...
Рейтинг: 0 / 0
06.06.2014, 11:44
    #38663360
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BV -> C#
Павел Зигмундович,

А чем эти примеры тебя не устаивают-то? везже используется обобщенный тип. Если ты передаешь туда DateTime, так тебе и вернется DateTime, передашь string- вернется string.

Кури учебник, главу "обобщенные типы"
...
Рейтинг: 0 / 0
06.06.2014, 13:01
    #38663498
BV -> C#
Shocker.Pro,

Ругается студия, что неверный тип возвращается(
...
Рейтинг: 0 / 0
06.06.2014, 16:37
    #38663884
iMrTidy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BV -> C#
Павел ЗигмундовичShocker.Pro,

Ругается студия, что неверный тип возвращается(

Тогда показывайте как используете функцию.
...
Рейтинг: 0 / 0
06.06.2014, 16:57
    #38663925
BV -> C#
Все, разобрался - public Func<object, object, object> Nullif = (t1, t2) => t1 != null && t2 != null && !t1.Equals(t2) ? t1 : null идеально подходит!!! Всем спасибо!!!
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / BV -> C# / 15 сообщений из 15, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]