조건부 논리 연산자 ||
및 &&
단락 논리 연산자라고도 하는 C # 언어 사양을 읽었습니다 . 나에게 nullable booleans, 즉 피연산자 유형 Nullable<bool>
(또한 작성 됨 bool?
)에 대해 존재하는지 명확하지 않은 것처럼 보였으 므로 비 동적 유형으로 시도했습니다.
bool a = true;
bool? b = null;
bool? xxxx = b || a; // compile-time error, || can't be applied to these types
그것은 질문을 해결하는 것처럼 보였습니다 (사양을 명확하게 이해할 수는 없지만 Visual C # 컴파일러의 구현이 정확하다고 가정하면 이제 알았습니다).
하지만 dynamic
바인딩도 해보고 싶었습니다 . 그래서 대신 이것을 시도했습니다.
static class Program
{
static dynamic A
{
get
{
Console.WriteLine("'A' evaluated");
return true;
}
}
static dynamic B
{
get
{
Console.WriteLine("'B' evaluated");
return null;
}
}
static void Main()
{
dynamic x = A | B;
Console.WriteLine((object)x);
dynamic y = A & B;
Console.WriteLine((object)y);
dynamic xx = A || B;
Console.WriteLine((object)xx);
dynamic yy = A && B;
Console.WriteLine((object)yy);
}
}
놀라운 결과는 예외없이 실행된다는 것입니다.
음, x
그리고 y
놀라운 일이 아니다되어, 그 선언은 두 속성이 검색되는 이어질하고, 결과 값은 예상대로되어 x
있습니다 true
및 y
입니다 null
.
그러나에 대한 평가 xx
로 A || B
인해 바인딩 시간 예외가 발생 A
하지 않고 B
. 왜 이런 일이 발생합니까? 당신이 말할 수있는, 우리는 변경 될 수 있습니다 B
처럼, 미친 개체를 반환 게터를 "Hello world"
하고, xx
여전히로 평가 것 true
바인딩 문제없이 ...
평가 A && B
(for yy
)도 바인딩 시간 오류가 발생하지 않습니다. 물론 여기서 두 속성이 모두 검색됩니다. 런타임 바인더에서 이것이 허용되는 이유는 무엇입니까? 에서 반환 된 객체 B
가 "불량"객체 (예 :)로 변경 string
되면 바인딩 예외가 발생합니다.
이것이 올바른 행동입니까? (사양에서 어떻게 추론 할 수 있습니까?)
당신이하려고하면 B
첫 번째 피연산자로, 모두 B || A
와 B && A
(런타임 바인더 예외 제공 B | A
및 B & A
모든 비 단락 사업자와 정상으로 잘 작동을 |
하고 &
).
(Visual Studio 2013의 C # 컴파일러 및 런타임 버전 .NET 4.5.2로 시도했습니다.)
Nullable<Boolean>
관련된 인스턴스가 전혀 없으며 박스형 부울 만 처리됩니다 .dynamic
테스트bool?
는 관련이 없습니다. (물론, 이것은 전체 응답, 하나의 세균이 아니다.)