2010-04-19 4 views
16

나는 C#에서 true 및 false 오버로드에 대해 읽었으며이 문제와 bool 연산자 정의의 기본적인 차이점을 이해한다고 생각합니다. 말을 나에게bool 연산자를 정의하는 대신 true 및 false를 오버로드하는 이유는 무엇입니까?

public static bool operator true(Foo foo) { 
    return (foo.PropA > 0); 
} 
public static bool operator false(Foo foo) { 
    return (foo.PropA <= 0); 
} 

,이 동일합니다 : 나는 주위를 볼 수있는 예는 같은이

public static implicit operator bool(Foo foo) { 
    return (foo.PropA > 0); 
} 

의 차이를, 지금까지의 내가 말할 수있는 것은 사실과 거짓 정의하여 별도로, 당신은 진실과 거짓, 또는 둘 다 참이나 거짓 둘 다 객체 가질 수 있습니다

public static bool operator true(Foo foo) { return true; } 
public static bool operator false(Foo foo) { return true; } 
//or 
public static bool operator true(Foo foo) { return false; } 
public static bool operator false(Foo foo) { return false; } 

나는이 허용되는 이유가 확실 해요,하지만 난 그냥이 무엇인지 생각할 수 없다. 나에게 개체를 true 또는 false로 변환 할 수있게하려면 단일 불 연산자가 가장 적합합니다.

누구나 내게 다른 방식으로 이해하는 시나리오를 제공 할 수 있습니까?

감사합니다.

+0

방금이 연산자를 찾았으며 몇 가지 테스트를 수행했습니다. 'if'는'true' 연산자만을 사용하고'if (! myObj)'는 전혀 가능하지 않으므로 모순되는'false' 연산자를 구현할 시점은 없습니다. 내가 놓친 게 있니? 'false' 연산자를 어떻게 사용할 수 있습니까? – ygoe

답변

11

truefalse은 (nullable) 데이터베이스 유형 (예/아니요, Y/N, 0/1 등)을 지원하기위한 것입니다.

물론 연산자와 마찬가지로 일관되게 정의 할 수 있습니다. 감각적 인 것을 돌려 보내는 것은 귀하의 책임입니다. 컴파일러는 어느 쪽이든 또는 둘 다를 요구하지 않습니다.

+0

고마워요. MSDN에서 그다지 멀지 않았습니다. 나는 [연산자 오버로딩] (http://msdn.microsoft.com/en-us/library/aa288467(VS.71%29.aspx " 연산자 과부하 "페이지를 참조하십시오.) 나는 많은 정보를 얻지 못했지만 실제로는 상상할 수 없었던 같은 방식으로 오버로드 할 수 있다는 사실을 생각하지 않았다고 생각합니다. 끝내 주셔서 감사합니다 –

1

시스템에 따라 true는 0이 아닌 값이 될 수 있습니다. 다른 경우에는 긍정적 인 가치가있을 수 있습니다.

다른 시스템은 진정한 부울이 아니며 부울 값에 세 번째 상태 인 null 또는 nill을 허용합니다. 따라서 하나의 불 연산자를 오버로드하는 대신 true 및 false를 오버로드 할 수 있습니다.

+0

이것은 특히 .NET 용이므로 .NET 응용 프로그램이 비 - 닷넷 코드와 통신한다는 것을 말하고 있습니까? –

+0

Joe, 이것은 .NET이 아니라 C#의 사양에있는 기능입니다. C#은 모든 시스템에서 사용될 수 있으며 true 및 false는 정의를 변경해야 할 수도 있습니다. –

+0

벤자민 : 응답 주셔서 감사합니다 - 몇 가지 덧글 : 첫째, 나는 이것이 다른 .NET 언어의 경우가 아니라 C# - VB의 경우라고 생각합니다.NET은 내가 틀리지 않는 한 특별한 것 같은 IsTrue와 IsFalse를 가지고 있습니다. 또한 C#을 모든 시스템에서 사용할 수 있다고 언급했습니다. 예전에 이런 말을하는 사람이 몇 명 있었지만 설명을 듣지 못했습니다. Mono 외에도 C#이 실제로 사용되는 .NET 외부의 다른 장소가 있습니까? 감사합니다. –

1

사람들이 Linq가 존재하기 전에 .NET 2.0에서 표현식 작성과 같은 영리한 일을하기 위해 truefalse 오버로드가 발생했습니다.

Ayende

그의 NHQG 프로젝트를 사용, NHibernate에 기준 쿼리를 작성하기 위해이 같은 구문을했다 :

return Repository.FindAll(
    (Where.Publisher.Name == name) && 
    (Where.Publisher.City == city)); 
+5

아, LINQ 전날 ... 사람들은 당시에 영리했던 끔찍한 일을 저질렀습니다. –

7

나는 이러한 연산자가 존재 몰랐다.

public class ThisClassIsFalse 
{ 
    public static bool operator true(ThisClassIsFalse statement) 
    { 
     return statement ? false : true; 
    } 

    public static bool operator false(ThisClassIsFalse statement) 
    { 
     return statement ? true : false; 
    } 
} 

그래서 지금 우리는이 고전적인 역설 ...있는 StackOverflowException에 대한 진정한 해결책을 알고있다 : 즉, 자기 부정의 모순을 구현할 수 있다는 것을 의미한다.

+0

public bool ThisMethodReturnsFalse() {return true;} –

관련 문제