Есть ли "противоположность" оператору слияния? (... на любом языке?) - PullRequest
86 голосов
/ 28 мая 2010

объединение нуля переводится примерно в return x, unless it is null, in which case return y

Мне часто нужно return null if x is null, otherwise return x.y

Я могу использовать return x == null ? null : x.y;

Неплохо, но то, что null в середине, всегда беспокоит меня - это кажется излишним. Я бы предпочел что-то вроде return x :: x.y;, где то, что следует за ::, оценивается, только если то, что предшествует ему, не null.

Я вижу это как почти , противоположное нулевой коалесценции, вроде смешанного с краткой, встроенной нулевой проверкой, но я [ почти ] уверен, что такого оператора нет в C #.

Есть ли другие языки с таким оператором? Если так, то как это называется?

(я знаю, что могу написать метод для этого на C #; я использую return NullOrValue.of(x, () => x.y);, но если у вас есть что-то лучше, я бы тоже хотел это увидеть.)

Ответы [ 12 ]

1 голос
/ 13 марта 2013
public class ok<T> {
    T s;
    public static implicit operator ok<T>(T s) { return new ok<T> { s = s }; }
    public static implicit operator T(ok<T> _) { return _.s; }

    public static bool operator true(ok<T> _) { return _.s != null; }
    public static bool operator false(ok<T> _) { return _.s == null; }
    public static ok<T> operator &(ok<T> x, ok<T> y) { return y; }
}

Мне часто нужна эта логика для строк:

using ok = ok<string>;

...

string bob = null;
string joe = "joe";

string name = (ok)bob && bob.ToUpper();   // name == null, no error thrown
string boss = (ok)joe && joe.ToUpper();   // boss == "JOE"
1 голос
/ 04 января 2012

Создайте где-нибудь статический экземпляр вашего класса со всеми правильными значениями по умолчанию для членов.

Например:

z = new Thingy { y=null };

тогда вместо твоего

return x != null ? x.y : null;

Вы можете написать

return (x ?? z).y;
...