문제

인라인 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 };
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top