2016-12-31 10 views
-5

C# 컴파일러 :C# 객체 인터페이스 반환 형식 공분산

오류 CS0738 : Field<T>' does not implement interface member Field.Value.get '최고의 구현 후보 Field<T>.Value.get' return type T'인터페이스 멤버 반환 형식 '객체'

public interface Field 
{ 
    object Value {get;} 
} 

public class MyField<T> : Field 
{ 
    T _value; 
    public T Value 
    { 
     get 
     { 
     return _value; 
     } 
    } 
} 
일치하지 않습니다

왜? List < T>는 Microsoft 클래스에서 List를 확장하지만 사용자 (동일한 디자인 패턴 복사)는 허용되지 않습니다. 왜? 객체 또한 컴파일러 오류를 제공합니다 ... 내가이 문제를 해결하려면 어떻게

를 : T 어디

시도?

같은 주제의 다른 1.000.000 스레드라고 말하십시오.
blablabla, 'return type covariance', blablabla, 'you cant'.

그들은이 짐승을 컴파일하는 방법에 대한 해결책이나 해결 방법을 제안하지 않습니다. 요구 사항 :
1) 필드는 제네릭을 사용할 수없는 인터페이스입니다. "단일성 (unity)"이라고 불리는 이블 프레임 워크는 제네릭을 금지합니다. "필드를 구현"
2) 필드 < T는> 오히려 object.Try이 대신

+1

보조 노트의 객체 양식을 얻을 : 왜 public으로 필드'_value'가 있습니까? 이것은 필드를 캡슐화하는 목적을 상실합니다 ... 개인용 –

+0

당신이 맞습니다. – user2186597

+4

C# 컴파일러는 여러분을 사랑하고 여러분이 안전하고 생산적이되기를 바래요. 그래서 때로는 위험하고 비생산적인 일을하지 않게됩니다. 엄마가 지붕 위에서 자전거를 타지 못하게했던 것처럼, 비록 그것이 굉장했을지라도. –

답변

6

인터페이스를 명시 적으로 구현할 수 있습니다. https://msdn.microsoft.com/en-us/library/ms173157.aspx

같은 패턴은 당신이 동일한 작업을 수행하고 너무 일반적인 인터페이스를 가질 수 IEnumerable의 비 일반 버전 및 일반 IEnumerable<T>

에 사용됩니다. 당신이 당신의 손에 Field<T>이있는 경우

public interface Field 
{ 
    object Value { get; } 
} 

public interface Field<T> : Field 
{ 
    new T Value { get; } 
} 

public class MyField<T> : Field<T> 
{ 
    public T Value { get; } // generic 

    object Field.Value => Value; // non generic 
} 

지금 당신은 행복 T를 사용할 수 있습니다. 당신이 Field이있는 경우 값 T

+0

굉장 같은 이름을 공유하고자, 가까이! 나는 나의 대답을 제거하고있다, 이것은 훨씬 좋다! +1! – CoolBots

+2

'Field '버전의 'Value'를 'new'로 표시하여 숨김이 의도적 이었음을 나타낼 수 있습니다. –

+0

필드 인터페이스가 필드를 상속하는 이유는 무엇입니까? MyField가 더 좋지 않겠습니까 : 필드 , 필드 대신? 그런 다음 당신은 상속을 숨기지 않습니다. – Nyranith

1

당신은 인터페이스에서 템플릿 유형을 사용하지 않는 일반 T.을 가지고 있지만 :

interface Field<T> 
    { 
     T Value { get; } 
    } 

public class MyField<T> : Field<T> 
    { 
     private T _value; 
     public T Value 
     { 
      get 
      { 
       return _value; 
      } 
     } 
    } 
+0

영업 그의 제약 중 하나가 인터페이스가 제네릭을 – CoolBots

+0

다음 필드 인터페이스를 지원하지 수 있다는 것을 주장 . – user2186597

2
public Object Value 
    { 
     get 
     { 
     return _value; 
     } 
    } 

이게 필요할지도 모르지. 모든 데이터 유형은 Object를 상속하지만 그 반대는 마찬가지입니다. 이것이 공분산 문제가오고있는 이유입니다.

+0

좋은 소식 같은 컴파일 오류가 발생 필드를 확장해야합니다, 그것은!를 컴파일하지만 내 네임 스페이스를 오염 것입니다. 모두 메타를 시도 오류 CS0102 :에 ODS 결과 '필드 '이 (가) 이미'에 대한 정의가 포함되어 값 ' – user2186597

1

나는 이것이 당신이 원하는 것과 정확히 일치하지 않습니다. 그러나 인터페이스가 일반적 일 수 없다면 이것이 작동 할 것입니다.

public interface Field 
{ 
    object Value {get;} 
} 

public class MyField<T> : Field 
{ 
    public T _value; 

    public T MyTypedValue 
    { 
     get 
     { 
      return _value; 
     } 
    } 

    public object Value 
    { 
     get 
     { 
      return _value; 
     } 
    } 
} 
+0

당신은 내가 MyTypedValue 또한 가치 방법 – user2186597

1
public class Field<T> : Field 
{ 
    T _value; 

    //specific interface implementation 
    object Field.Value 
    { 
    get 
    { 
     return _value; 
    } 
    } 

    public T Value 
    { 
     get 
     { 
     return _value; 
     } 
    } 
}