2012-09-05 2 views
3

다음과 같이 나는 인터페이스를 구현하는 클래스가 : 나는 다음과 같은 멤버 변수가 다른 클래스에서C# 및 ReSharper에서 : 확인 객체의 유형

public class Database : IStore 

;

private IStore store; 

다음과 같이 저장 변수에 유형 검사를 수행하는 방법 :

if (store is Database) 

ReSharper에서이 조건이 항상있을 것입니다 주장 및 데이터베이스의 인스턴스는 동적으로 런타임에 할당됩니다 그릇된. 또한 "데이터베이스로 저장"은 항상 null이 될 것이라고 주장합니다. 왜 그런가요? 이 인터페이스 유형 멤버가 보유한 런타임 객체 유형을 확인하는 가장 좋은 방법은 무엇입니까? 아마도 '이것이 사실이 아닐 수도 있습니다'라고 항상 말하고있는 것일까 요? R 번호 중 하나가 두 개의 서로 다른 IStore 유형을 가지고, 그리고 클래스가 다른 하나를 구현 할 때 실제로 당신이 일에 대해 테스트하고, 을 혼동하거나처럼

+0

개인 필드 저장소가있는 전체 클래스를 표시 할 수 있습니까? –

+0

질문 작성에 대한 설명 : 서명/추억 노트를 추가하지 마십시오. 사용자 이름이 이미 있습니다. 추가 서명이 필요하지 않습니다 (이름이 게시물에 있어야한다고 생각하면 프로필을 수정해야합니다), 질문에 "미리 감사드립니다"를 추가하지 말고 좋은 대답을 수락하십시오. –

+0

질문에 업데이트 : 미안하지만, 인터페이스 부분에 대해 나쁘다 - 그것은 인터페이스 였고 누군가가 최근에 "추상 클래스"로 변경되어 일부 일반적인 메소드를 사용할 수있게되었습니다. 따라서 IStore는 이제 공용 추상 클래스에 대한 나쁜 이름입니다. :-) – user392005

답변

4

소리가 난다. (또는 다른 두 가지 종류의 Database 유형이 있습니다. 가능성은 같습니다.)

문제를 나타내는 짧지 만 완전한 예제를 생성 할 수 있습니까? as/is 연산자가있는 IStoreDatabase에 마우스를 올리면 원하는 정규화 된 형식 이름이 표시됩니까? 코드를 실행하면 으로되어 if 본문에 들어갑니다.

+2

ReSharper가 * 실제로 * 틀린 상황을 아직 찾지 못했습니다. –

+0

@pst 어제 오후 내 "암시 적으로 String을 Object로 변환 할 수 없습니다"에 대해 어떻게해야합니까? – phoog

+0

@pst 대답을 참조하십시오. 개체 매개 변수를 사용하는 인덱서에 인수로 문자열 상수를 전달하는 메서드를 편집하고있었습니다. ReSharper는 문자열이 암시 적으로 객체로 변환 될 수 없다고 불평했습니다. – phoog

1

제 생각 엔 데이터베이스라고하는 다른 클래스가 있습니다. '데이터베이스입니다'를 가리키고 올바른 네임 스페이스인지 확인하십시오. 그렇지 않은 경우 명시 적으로 원하는 네임 스페이스를 네임 스페이스로 사용하십시오.

2

ReSharper는 분명히 잘못되었습니다. 그 질문이 이유입니다. 유형을 잘못 해석 할 수 있습니다.

현재 프로젝트가 컴파일 중입니까? 잘못된 코드를 분석하는 것은 어렵고 코드를 편집 할 때 종종 잘못된 코드가 표시됩니다. 최근에 ReSharper가 잘못된 유형 오류 ("암시 적으로 String을 Object로 변환 할 수 없습니다"와 같은)를 제공하는 여러 사례를 발견했습니다. 컴파일 할 솔루션의 모든 프로젝트를 얻은 후에는 사라졌습니다.

다른 가능성 : 클래스의 필드 store을 숨기는 로컬 변수 store이 있습니다. 그것을 확인하려면, 당신은 당신은 또한 예상되는 장소로 이동 있는지, store의 선언과 Database의 이동 ReSharper에서의 탐색을 사용하여 시도 할 수

if (this.store is Database) 

에 코드를 변경할 수 있습니다.

0

이 코드에서 Resharper는 그 조건을 항상 거짓이라고 말하지 않습니다.

public interface IStore 
{ 

} 

public class Database:IStore 
{ 

} 

public class TestClass 
{ 
    private readonly IStore _store; 

    public TestClass(IStore store) 
    { 
     _store = store; 
    } 

    public void SomeMethod() 
    { 
     if(_store is Database) 
      return; 
     throw new NotImplementedException(); 
    } 
}