2017-12-21 5 views
3

ReSharper에서IGeneric<TGeneric>에 있지만 ISimple 인터페이스에 대한 가능한 무한 상속 경고 주는가?C#을 ReSharper에서 : 가능한 무한 상속

// api 

public interface INodeBase<TNode> 
    where TNode : INodeBase<TNode> 
{ 
    TNode Parent { get; set; } 
    List<TNode> Children { get; set; } 
} 

public interface INode<TValue> 
    : INodeBase<INode<TValue>> 
{ 
    TValue Value { get; set; } 
} 

public interface IBelongToNodeBase<TOwner> 
    where TOwner : INodeBase<TOwner> 
{ 
    TOwner Owner { get; set; } 
} 

// All good 
public interface ISimple 
    : IBelongToNodeBase<INode<ISimple>> 
{ 
} 

// Possible infinite inheritance 
public interface IGeneric<TGeneric> 
    : IBelongToNodeBase<INode<IGeneric<TGeneric>>> 
{ 
} 

ReSharper의 인텔리 센스와 관련된 문제 일 수 있습니까? 이것은 실제 사례 시나리오에서 나오며 코드는 아무런 문제없이 컴파일되고 실행됩니다.

+1

"_ 가능성 _ 무한 상속"이라고 말한 이후로 무한 상속으로 이어지는 방식으로'IGeneric '을 구현하는 클래스를 선언 할 수 있다고 생각합니다. 그러나 결코 이러한 구조물 주위에서 머리를 맞을 수는 없습니다. –

+0

'ISimple'대소 문자는 사소한 것이지만 일반적이지 않습니다. 질문을 편집하고'인터페이스 IGenericNoProblem : INode '예제를 사용해야합니다. 이 경우 경고는 인터페이스를 구현하는 클래스에만 표시되고 'IGeneric '처럼 인터페이스 자체에는 표시되지 않습니다. 이 사람이 나에게 경고를하지 않는 이유 –

답변

0

ReSharper 설명서는 René에서 제공 한 link을 기반으로 제네릭이 참조하는 세 단계의 중첩 후에이 문제를 제기합니다. 다음과 같은 상황에서

:

class B<U> 
{ 
} 
class A<T> : B<A<A<T>>> 
{ 
} 

당신은 효과적으로 결과적으로 무한 순환 형 B를 상속 A 형으로 끝낼, 어셈블리가 컴파일, 그러나 당신은 그것을 실행할 수 없을 것입니다. 시도 할 경우 다음과 유사한 오류 메시지가 표시됩니다.

어셈블리 'ConsoleApplication1, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null'어셈블리에서 'ConsoleApplication1.A {{1' 재귀 적 일반 정의가 있기 때문입니다.

+0

다음 : '인터페이스 IGenericNoProblem : inode는 >' 나이 : '인터페이스 IGenericNoProblem : INodeBase >' – chainerlt

+0

@chainerlt, 내가 생각하는 그 것 Resharper 팀의 지원 티켓. 맞습니다. 예제는 제공된 샘플을 기반으로 동일한 경고를 가정해야합니다. – DiskJunky

+1

아니요. 작동하지 않는 예제에서 일반 인수가 작동중인 INDE 보다 더 깊게 중첩되어 있다고 생각하지 않습니다. >'(ok, 2 level) 대'IBelongToNodeBase >> (실패, 3 수준). 그리고 3 단계 버전은 [설명] (https://www.jetbrains.com/help/resharper/2017.3/PossibleInfiniteInheritance.html)에 r #이 표시됩니다. –