2014-01-29 3 views
4

Есть ли ненуль сливающихся оператор в C#, которые в случае могут быть использованы, например, как:Есть ли способ реализовать и использовать оператор «НЕ-нулевой коалесценции»?

public void Foo(string arg1) 
{ 
    Bar b = arg1 !?? Bar.Parse(arg1); 
} 

Следующий случай заставил меня думать об этом:

public void SomeMethod(string strStartDate) 
{ 
    DateTime? dtStartDate = strStartDate !?? DateTime.ParseExact(strStartDate, "dd.MM.yyyy", System.Globalization.CultureInfo.InvariantCulture); 
} 

Я не мог бы есть strStartDate информация, которая в случае будет null, но если я это сделаю; я всегда уверен, что он будет в ожидании формат. Поэтому вместо инициализации dtStartDate = null и попытке установить parse и установить значение в пределах try catch блока. Это кажется более полезным.

Я полагаю, что ответ нет (и нет такого оператора !?? или что-нибудь еще) Интересно, есть ли способ, чтобы реализовать эту логику, будет ли это стоит и что бы случаи, что речь идет о полезной.

+1

почему бы вам не использовать просто [условный: Оператор] (http://msdn.microsoft.com/en-us/library /ty67wk28.aspx)? –

+0

Что вы подразумеваете под словом "no null coalescing"? Если вы написали, что он сделал в обычном коде «this compiles now» (используя «if» или «conditional *»), как бы он выглядел? –

+0

@ Selman22 Не * нулевой коалесцирующий * синтаксический сахар для * tenary *? Вы могли бы «x = x! = Null? x: y' вместо 'x = x ?? а также. Я полагаю, это не так, извините kardeşim –

ответ

6

Mads Torgersen публично сказал, что оператор, несущий нуль, рассматривается в следующей версии C# (но также подчеркнул, что это не означает, что он будет там). Это позволило бы такой код:

var value = someValue?.Method()?.AnotherMethod(); 

где ?. возвращает null если операнд (слева) является null, иначе будет оценивать правую часть. Я подозреваю, что вы получите здесь много пути, особенно в сочетании с (скажем) методами расширения; например:

DateTime? dtStartDate = strStartDate?.MyParse(); 

где:

static DateTime MyParse(this string value) { 
    return DateTime.ParseExact(value, "dd.MM.yyyy", 
     System.Globalization.CultureInfo.InvariantCulture 
); 

Однако! Вы могли бы сделать то же самое прямо сейчас только используя методы расширения:

DateTime? dtStartDate = strStartDate.MyParse(); 

static DateTime? MyParse(this string value) { 
    if(value == null) return null; 
    return DateTime.ParseExact(value, "dd.MM.yyyy", 
     System.Globalization.CultureInfo.InvariantCulture 
); 
+0

Вот и ответ, спасибо. Я считал ваше предложение * прямо сейчас * альтернативным для использования условного оператора. –

+0

Знаете ли вы, было ли уделено какое-либо внимание, вместо того, чтобы иметь только оператор, который отображает null в null, имея эквивалент [foo? .bar: baz] [но для 'foo' оценивается только один раз] до' foo? foo.bar: baz'? Я думаю, что оба делают синтаксис более полезным, а также приближают его к '? : '. – supercat

2

Просто используйте тройное conditional operator ?::

DateTime? dtStartDate = strStartDate == null ? null : DateTime.ParseExact(…) 

Оператор предложил вам на самом деле не легко выполнимо, потому что он имеет не последовательный тип:

DateTime? a = (string)b !?? (DateTime)c; 

Для этого выражения на работу, компилятору нужно было бы знать во время компиляции, что b имеет значение null, так что строковое значение (null) может быть присвоено a.

+0

Вот что я сделал –

Смежные вопросы