2014-09-12 8 views
2

Есть ли способ объявить унарный оператор, такой как '! ??'Как я могу объявить новый оператор «! ??» (тестовый объект не равен нулю)

Я представляю себе что-то вроде этого (не работает код)

public bool operator !??<T> (this <T> item) { 
    return item != null; 
} 

так я хотел бы использовать его как такой

// day is a value and might possibly be null 
string greeting = name !?? "hello there " + name; 

Я считаю себя часто приходится делать эту неловкость

// day is a value and might be null 
string greeting = day != null ? "hello there " + name : ""; 

Это довольно ясно в примере, который я предоставил, но когда вы используете геттер/сеттер s для моделей просмотра, он немного запутывается, чтобы смотреть на него, и повышает вероятность пропущения логической ошибки. Таким образом:

public DateTime? SearchDate { 
    get { return _searchDate; } 
    set { _searchDate = value != null ? value.Value : value; } 
} 
+5

Это совершенно невозможно. Однако вы хотите, чтобы C# 6 '? .'. – SLaks

+0

# EricLippert уже изобрел такой оператор в своем C# 6.0 или что-то еще. – AgentFire

+0

Кроме того, это будет оператор _binary_. – SLaks

ответ

2

Как уже было сказано, вы не можете объявлять новые операторы в C# вообще. Это ограничение языка, компилятора и среды.

Что вы можете сделать, это использовать null coalescing operator или написать несколько родовое Extension Methods обрабатывать то, что вы хотите, например,

public static string EmptyIfNull(this string source, string ifValue, string ifNull = "") 
{ 
    return source != null ? ifValue : ifNull; 
} 

и реализуется через

string greeting = name.EmptyIfNull("hello there " + name); 
+0

Мне не только нравится этот ответ, но я понимаю вопрос лучше, прочитав его! :) –

+0

@aravol спасибо. Это то, что я делаю уже. Я просто надеялся сделать что-то более четко. Спасибо, что нашли время ответить мне :) –

6

Это совершенно невозможно.

Вместо этого, вы можете использовать C# 6 в ?. оператора:

value?.Value 
+0

У вас есть это назад сэр, '? .' – Haney

+1

@Haney: Oops; исправлено. Благодаря! – SLaks

1

Там нет никакого способа, чтобы объявлять новые операторы в C# вообще, все, что вы можете сделать, это переопределить существующие.