2014-09-12 6 views
2

'! ??'와 같은 단항 연산자를 선언 할 수있는 방법이 있습니까?새 연산자 "!"를 어떻게 선언 할 수 있습니까? (테스트 객체가 null이 아님)

나는 자신이 자주 어색함

// day is a value and might be null 
string greeting = day != null ? "hello there " + name : ""; 
을 할 필요 찾아이 같은 (비 작동 코드)

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; 

처럼 사용하는 것이 상상

필자가 제공 한 예제에서는 상당히 명확하지만 getter/setter 뷰 모델에 대해서는 약간 헷갈 렸고 논리적 인 오류가 누락 될 가능성이 높아졌습니다. 따라서 :

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의 ?. 연산자를 사용할 수 있습니다 : 모든 C#에서 새 연산자를 선언하는 방법이 없습니다

value?.Value 
+0

당신은 그것을 뒤로 가지고 있습니다,'?. – Haney

+1

@Haney : Oops; 결정된. 감사! – SLaks

1

, 당신이 할 수있는 모든는 기존보다 우선합니다.