대표

2013-08-22 2 views
4

내 질문이 비슷한 비트입니다. 예를 들어, 코드 : there isn't implicit convertion from Action<int> to Foo1. 그러나이 normaly이 같은 일 때문에대표

class Program 
{ 
    private delegate void Foo1(int x); 
    private delegate void Foo2(int x); 


    static void Main(string[] args) 
    { 
     Foo1 foo1 = Console.WriteLine; 
     Foo2 foo2 = Console.WriteLine; 

     Call(foo1); 

     Call2(foo2); 
    } 

    static void Call(Action<int> action) 
    { 
     action(10); 
    } 

    static void Call2(Foo1 action) 
    { 
     action(10); 
    } 
} 

는 컴파일되지 않습니다. 따라서이 이름은 별칭이 아니며 실제 이름이 아님을 의미합니다. 그래서 별칭처럼 생각하는 것이 좋습니다. 그래서이 경우에 우리는 delegate, that get one int value and returns nothing의 3 개의 별칭을 가지고 있습니다. 그리고이 대의원은 완전히 상호 교환 할 수 있습니다. 그러나 우리는 그것을 가지고 있지 않습니다. 그래서 질문은 : 왜? 서명을 통해 동일한 것이므로 구현이 없으므로 동일한 서명을 가진 대리인이 여러 별칭과 동일하고 동일합니다 ...

C# 결함이 있습니까? 아니면 이유가 있습니까? 나에 관해서는, 나는 어떤 것도 보지 못한다.

+4

내가이 결함 생각하지 않는다, 개인적으로하지만,이 * 내가 할 때 짜증 왜 *입니다 사람들은'Action' /'Func'을 사용하는 대신 자신의 대표자를 정의합니다. – Servy

답변

2

두 가지 유형 사이에 암시 적 변환이 없다는 것을 같은 이유로 두 대표 사이에 암시 적 변환이 없습니다 : 두 개의 클래스가 같은 필드를 가지고 있기 때문에

public sealed class Foo1 
{ 
    public string Value { get; set; } 
} 

public sealed class Foo2 
{ 
    public string Value { get; set; } 
} 

그냥 당신이 할 수 있어야한다는 것을 의미하지 않습니다는 하나를 다른 것처럼 취급합니다. 동일한 논리가 델리게이트에도 적용됩니다 (유형이기도 함).

해당 유형의 생성에 의미 론적 의미가 적용됩니다. 누군가 Foo1을 만든 경우 Foo2이 아닌 Foo1이되기를 원합니다. 그들이 Foo1을 사용하려고하지 않을 경우 Foo2이 예상됩니다. 유형이 비슷하게 보일지라도이 두 유형 간에는 의미상의 차이가 있습니다. 프로그래머가 컴파일러가 알지 못하는 것을 아는 경우 명시 적 변환을 사용하여 수행중인 작업을 알 수 있음을 나타낼 수 있습니다.

가 (이전 단락은 의도적으로 대표단에 동일하게 적용하도록 작성하고, 클래스가 내가 위에서 제공되었다.)

+0

아니요. 클래스는 부분적 일 수도 있고 상속 될 수도 있습니다. 예를 들어, 액션 이 있습니다. 나는 그것에 대해 간단한/XML 주석을 쓰고 싶지는 않습니다. 간단히 말해서 MySpecialDelegate = Action 과 같은 것을 쓸 수 있습니다. 단지 자체 문서화 코드 일뿐입니다. 클래스의 경우 훌륭한 기능이 될 수 있지만, 거의 두 클래스 **가 동일하지 않기 때문에 빈번하게 사용되지는 않습니다 ** 그러나 대리인은 있습니다. 내가 '쓸 때'MyAlarmTimer = System.Timers.Timer'을 사용하면 '큰 붉은 깃발'을 의미하는 것이 아니라, 단지 일부 코드를 단순화하고 설명없이 설명하기를 원합니다. –

+1

왜 내가 여기서 똑같이 할 수 없습니까? 나는 몰라. 이 경우와 마찬가지로 별칭 일 뿐이므로 실행 코드에 차이가 없습니다. 그리고 .Net의 모든 대리인이 Action/Func으로 자동 변환 될 수 있다면 매우 좋을 것입니다. –

+0

@AlexJoukovsky 동일한 서명을 가진 모든 메소드가 동일하지는 않습니다. 이 방법의 의미 론적 의미가 더 중요하게 생각할 수도 있습니다. * 당신은 그 의미 론적 의미를 부여하기 위해 다른 대의원을 사용할 수는 없지만, 그렇다고해서 아무도하지 않거나, 언어 설계자가하지 말아야한다고 생각한 것은 아닙니다. 부분적인 수업은 관련성이 없습니다. 일단 컴파일러에 의해 컴파일되면 그것은 단지 하나의 클래스 정의입니다. 상속받는 것에 관해서는 봉인 될 수 있습니다. 나는 그것이 당신을 기분 좋게한다면 나의 모범에 덧붙였다. – Servy