2013-06-09 2 views
8

에는 T를 사용하는 메서드가있는 클래스가 있다고 가정합니다. 같은 이름의 표준 메서드도 있습니다.Generics 메서드 서명과 표준 서명이 동일합니다.

T가 표준 방법과 동일한 유형 일 경우 어떻게됩니까? 표준 메소드가 호출됩니다.

어쨌든 T- 메소드를 강제로 호출 할 수있는 방법이 있습니까?

using System;

namespace ConsoleApplication3 
{ 
class Program 
{ 
    static void Main() 
    { 
     Generics<Int32> anInt = new Generics<Int32>(4); 
     Generics<String> aString = new Generics<String>("test"); 
    } 
} 

public class Generics<T> 
{ 
    public T Member; 

    public String ErrorMessage; 

    public Generics(T member) 
    { 
     this.Member = member; 
    } 

    public Generics(String errorMessage) 
    { 
     this.ErrorMessage = errorMessage; 
    } 
} 
} 
+2

[this] (http://blogs.msdn.com/b/jaredpar/archive/2008/04/14/gotcha-generic-overload-resolution-whe)을 확인 했습니까? n - generically.aspx) 아웃? – sq33G

+0

같은 이름의 메소드가 이미 존재하는 경우 메서드 이름을 변경해야하며 다른 프로그래머가 코드를 상속한다고 상상해보십시오. – Sayse

+0

고마워, sq33G, 지금은 그것을 우회하는 방법을 이해합니다. 제 경우 저는 조금 다르게갔습니다. 나는 Generic 에서 파생되었고 나를 올바르게 처리하는 생성자를 썼다. –

답변

5

죄송합니다.

가장 간단한 해결 방법은 동작의 차이를 나타내는 두 가지 메서드 이름을 사용하는 것입니다. 문제의 메서드 이름은 생성자이므로 이름을 제어 할 수 없으므로 적어도 하나를 일반 메서드로 변경해야합니다. 예를 들어 :

public class Generics<T> 
{ 
    public T Member; 

    public String ErrorMessage; 

    public Generics(T member) 
    { 
     this.Member = member; 
    } 

    private Generics() 
    { 
     // empty constructor just to allow the class to create itself internally 
    } 

    public static Generics<T> FromError(String errorMessage) 
    { 
     return new Generics<T> { ErrorMessage = errorMessage }; 
    } 
} 

는 개인적 행동의 차이가 사용자에게 절대적으로 명확하게되도록, 정적 메서드로 두 생성자를 변경합니다. 그러나 한 생성자 만 변경하면 오류가 발생합니다.

1

오케이, 대답에 대한 답을 말씀 드리겠습니다.

우선이 작업을 수행하지 마십시오. 하지 마라. 인간이 컴퓨터뿐 아니라 코드를 읽을 수 있기를 원합니다. (거기, 나는 C# 프로그래머 공간의 일원으로서 나의 의무를 다했다)

초. 당신이 당신이 일반적인 방법을 사용하도록 강제로 호출하고 어떤 종류의 컴파일 할 때 컴파일러가 말할 수 있도록 코드를 디자인 할 경우

:

으로는 here을 설명했다.

static Generics<T> Test<T> (T parameterToTest) { 
    return new Generics<T>(parameterToTest); 
} 

static void Main() 
{ 
    Generics<Int32> anInt = Test<Int32>(4); 
    Generics<String> aString = Test<String>("test"); 
} 
0

단순히 (이 특정한 경우에) 이런 짓을 :

나는 제네릭

protected Generics() { } 

을 빈 보호 생성자를 추가 그리고 나는 = 문자열

T의 특정 경우에 파생
public class GenericsOfString : Generics<String> 
    { 
     public GenericsOfString(String text, Boolean isErrorMessage) 
     { 
      if (isErrorMessage) 
      { 
       this.ErrorMessage = text; 
      } 
      else 
      { 
       this.Member = text; 
      } 
     } 
    }