Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 1개 있습니다.)

BeginInvoke에 전달한 람다 함수에 CS1660 에러가 발생하는 경우

WPF 프로젝트를 만들고, 다음과 같이 BeginInvoke를 호출하려고 했습니다.

using System.Windows;

namespace WpfApp1
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            // 컴파일 오류 발생: CS1660
            this.Dispatcher.BeginInvoke((arg) =>
            {

            }, null);
        }
    }
}

그런데, 다음과 같은 컴파일 오류가 발생합니다.

error CS1660: Cannot convert lambda expression to type 'DispatcherPriority' because it is not a delegate type

// 또는

error CS1660: Cannot convert lambda expression to type 'Delegate' because it is not a delegate type

정말 이상하군요... 예전에 잘 사용한 적이 있었던 것 같은데?!!!

이런 경우, 다음과 같이 바꿔주면 컴파일이 잘 됩니다.

// 전달해야 할 인자가 있는 경우,
this.Dispatcher.BeginInvoke((System.Action<object>)((arg) =>
{
    MessageBox.Show("TEST");
}), this);


// 전달해야 할 인자가 없는 경우,
this.Dispatcher.BeginInvoke((System.Action)(() =>
{
    MessageBox.Show("TEST");
}), null);

그래도 왠지... 명시적인 형 변환이 마음에 들지 않습니다. 그래서 검색해 봤는데 뜻밖의 글이 나오는군요. ^^

Dispatcher.BeginInvoke: Cannot convert lambda to System.Delegate
; http://stackoverflow.com/questions/4936459/dispatcher-begininvoke-cannot-convert-lambda-to-system-delegate

그러니까, "System.Windows.Presentation" 어셈블리를 참조한 후, "using System.Windows.Threading;" 선언을 추가하면 BeginInvoke에 Action을 받도록 하는 확장 메서드가 포함되기 때문에,

namespace System.Windows.Threading
{
    public static class DispatcherExtensions
    {
        public static DispatcherOperation BeginInvoke(this Dispatcher dispatcher, Action action);
        public static DispatcherOperation BeginInvoke(this Dispatcher dispatcher, Action action, DispatcherPriority priority);
        public static void Invoke(this Dispatcher dispatcher, Action action);
        public static void Invoke(this Dispatcher dispatcher, Action action, DispatcherPriority priority);
        public static void Invoke(this Dispatcher dispatcher, Action action, TimeSpan timeout);
        public static void Invoke(this Dispatcher dispatcher, Action action, TimeSpan timeout, DispatcherPriority priority);
    }
}

이렇게 호출하는 코드가 정상적으로 컴파일이 됩니다.

this.Dispatcher.BeginInvoke(() =>
{
    MessageBox.Show("TEST");
});

하지만, 보는 바와 같이 Action에 인자 전달을 받는 것은 확장 메서드로 재정의되어 있지 않기 때문에 다음과 같은 코드의 경우 여전히 오류가 발생합니다.

// error CS1660: Cannot convert lambda expression to type 'DispatcherPriority' because it is not a delegate type
this.Dispatcher.BeginInvoke((arg) =>
{
    MessageBox.Show("TEST");
}, this);

위와 같이 인자를 전달하려면 어쩔 수 없이 명시적인 Action 형 변환을 해야만 합니다.

using System.Windows;
using System.Windows.Threading;

namespace WpfApp1
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            this.Dispatcher.BeginInvoke((System.Action<object>)((arg) =>
            {
                MessageBox.Show("TEST");
            }), this);

            // 또는,

            this.Dispatcher.BeginInvoke((System.Action<MainWindow>)((arg) =>
            {
                MessageBox.Show("TEST");
            }), this);
        }
    }
}




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 5/27/2017]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 166  167  168  169  170  171  172  173  174  175  176  177  178  179  [180]  ...
NoWriterDateCnt.TitleFile(s)
528정성태8/30/200722081오류 유형: 47. VPC - 네트워크 어댑터 MAC 주소 중복 오류
527정성태8/30/200732371Team Foundation Server: 20. 잠긴 파일을 강제로 해제 [2]
526정성태8/29/200722260오류 유형: 46. VS.NET 2008 - ASP.NET 디버깅 : Strong name validation failed.
525정성태8/27/200724427VS.NET IDE: 54. VS.NET 2008 - 새롭게 도입되는 XSD Schema Designer
524정성태8/23/200742002오류 유형: 45. 요청한 작업은, 사용자가 매핑한 구역이 열려 있는...
523정성태8/16/200724547VS.NET IDE: 53. VS.NET 2008 - 서비스 참조 시 기존 데이터 컨테이너 DLL 사용
522정성태8/13/200728149VS.NET IDE: 52. VS.NET 2008 - WCF를 위한 디버깅 환경 개선
521정성태8/8/200727964.NET Framework: 92. XmlSerializer 생성자의 실행 속도를 올리는 방법 - 두 번째 이야기 [3]
520정성태8/7/200723318VS.NET IDE: 51. Visual Studio 2008 베타 2 설치
519정성태7/27/200729779오류 유형: 44. System.BadImageFormatException [2]
518정성태7/26/200730893오류 유형: 43. System.ComponentModel.LicenseException [1]
517정성태7/19/200719007개발 환경 구성: 26. VPC - 일반 사용자 계정으로 구동
516정성태7/19/200722299오류 유형: 42. TFS - Error loading menu: Index was outside the bounds of the array [2]
515정성태7/18/200730244오류 유형: 41. SSL 서버 자격 증명을 만드는 동안 심각한 오류가 발생했습니다.
514정성태7/14/200722706Team Foundation Server: 19. Orcas에서 개선되는 TFS 기능들
513정성태7/4/200733903.NET Framework: 91. Foreground Thread / Background Thread [1]
512정성태6/27/200723457오류 유형: 40. error PRJ0050: Failed to register output.
511정성태6/25/200731730.NET Framework: 90. XmlSerializer 생성자의 실행 속도를 올리는 방법 [2]
510정성태6/25/200746853디버깅 기술: 15. First-Chance Exception
508정성태6/21/200729822Team Foundation Server: 18. Team Build에 사용되는 각종 Property 값 [4]
507정성태6/11/200727375VS.NET IDE: 50. Orcas - UAC 설정 관련
506정성태6/9/200722121오류 유형: 39. VC Package not available or not registered
505정성태6/9/200721834오류 유형: 38. Visual SourceSafe - DB 잠김 오류
504정성태6/9/200727242오류 유형: 37. Visual SourceSafe - Anaylze 도중 비정상 종료
503정성태6/7/200729865VS.NET IDE: 49. Orcas - VC++ 다중 소스 동시 컴파일 옵션: /MP
502정성태6/7/200724641VS.NET IDE: 48. Orcas - VC++ 프로젝트 마이그레이션
... 166  167  168  169  170  171  172  173  174  175  176  177  178  179  [180]  ...