구조 개편중이라 기능별 분할중인데 예를들면
class Program
{
static void Main()
{
int i = 3;
b.Take.mix(() => a.Take.hi(), () => b.Take.hi(i));
}
}
public void mix(Object ? action1 = null, Object ? action2 = null)
{
if (action1 is Action)
{
a.Take.NextEvent += () => (action2 as Action)?.Invoke();
(action1 as Action)?.Invoke();
};
}
이런식으로 함수를 람다식으로 넣어 작동시킬려함 비주얼스튜디오 환경상에선 a.Take.hi() 이걸 람다식으로 오브젝트로 넣을수있는데
문제는 유니티 환경에서 비슷하게
UIComposer.Call.lk(() => test()); 이런식으로 선언하면 람다 식은(는) 대리자 형식이 아니므로 'object' 형식으로 변환할 수 없습니다.CS1660 이게뜸
불러오는 함수는 다음과 같음
public void lk(object? action1 = null)
{
if (action1 is Action action)
{
action?.Invoke();
}
}
넣은 함수는 단순히 출력만함
public void test()
{
Debug.Log("test");
}
c#환경에선 람다식으로 함수를 오브젝트에 넣을수있는데 유니티에선 저런식으로 막힘, 이유가있음? .net버전문제인지 뭔지 모르겠음
Object 말고 Action, Func 이런거 써야해
에초에 타입이 Action 인지 확인하고 돌리는데 저게 돌아간다고 해도 쓸모없는 박싱 언박싱 할 이유가 없지
비주얼스튜디오에서 구조 연구하면서 시연할때는 public void mix(Object ? action1 = null, Object ? action2 = null) 이런식으로 받아도 잘되더라고요 유니티에선 안되니깐 유니티는 뭐 조건이 좀 달라졌나 해서요 일단 Action으로 구현해둔 상태입니다
찾아보니까 c# 10 에서 추가되었네
https://learn.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-version-history#c-version-10
https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/operators/lambda-expressions#natural-type-of-a-lambda-expression
unity6 가 지원하는게 c# 9.0이라서 그럴거야