강력하게 입력 한 람다 표현식을 작성하는 방법?
문제
인라인 if 문장 내에서 람다 표현을 쓰고 싶습니다. 그러나 인라인 if 문에는 강력한 유형 결과가 있어야합니다.
MyType obj = someObj.IsOk ? null : () => {
MyType o = new MyType(intVal);
o.PropertyName = false;
return o;
};
물론 Lambda 표현은 강력하게 입력되지 않기 때문에 이것은 작동하지 않습니다. 나는 사용을 생각했다 Func<intVal, MyType>
강력한 유형을 만들기 위해 대표합니다.
그러나 나는 이것을 어떻게 사용합니까? Func<>
내부 인라인 if? 내 자신의 기능을 외부에서 정의하고 인라인 if 문으로 사용해야합니까?
해결책
더 복잡한 코드를 사용하더라도 객체 이니셜 라이저 표현식을 사용할 수 있습니다.
MyType obj = someObj.IsOk ? null : new MyType(intVal) { ProName = false };
만약 너라면 진짜 그래도 람다를 사용하고 싶다면 다음을 쓸 수 있습니다.
MyType obj = someObj.IsOk ? null : ((Func<MyType>) (() => {
MyType o = new MyType(intVal);
o.ProName = false;
return o;
}))();
그러나 이것은 솔직히 a입니다 악몽 괄호와 캐스트. 도우미 방법으로 더 간단하게 만들 수 있습니다.
public T Execute(Func<T> func)
{
return func();
}
...
MyType obj = someObj.IsOk ? null : Execute(() => {
MyType o = new MyType(intVal);
o.ProName = false;
return o;
});
다른 팁
여기에는 Lambda의 타이핑과 관련이 없습니다. 당신도 반환하려고합니다 null
또는 (인수가없고 MyType를 반환하지 않는 함수) 그러나 당신은 컴파일러에게 그 진술의 결과가 함수가 아니라 myType이라고 말하고 있습니다. 나는 당신이하고 싶은 것이 생각합니다
MyType obj = someObj.IsOk ? null : new MyType(intVal);
이런 것이 있다면 ...
var obj = (someObj.IsOK) ? null : () => {
return new MyType(intVal) { PropName =false }; }
오류가 발생합니다 ...
"Null과 Lambda 표현 사이에는 명백한 전환이 없습니다."
그 이유는 이것에서 논의됩니다 그래서 스레드.
마크는 코드 샘플로 무엇을하려고하는지에 맞습니다.
var obj = someObj.IsOk ? null : new MyType(intVal) { PropName = false };
제휴하지 않습니다 StackOverflow