Reporter |
|
---|---|
Created | Apr 6, 2018 5:12:50 PM |
Updated | Apr 6, 2018 5:34:35 PM |
Subsystem | No Subsystem |
Assignee | Unassigned |
Priority | Normal |
State | Submitted |
Type | Unspecified |
Fix version | No Fix versions |
Affected versions | No Affected versions |
Fixed In Version ReSharper | Undefined |
VsVersion | All Versions |
Description
When an interface is never implemented, all casts to this interface are expected to return null, which may lead to dead code that could be detected.Sample repro
[UsedImplicitly(ImplicitUseTargetFlags.WithMembers)]
public interface IUsed
{
string Value { get; }
}
internal interface INotImplemented : IUsed
{
}
[UsedImplicitly(ImplicitUseTargetFlags.WithMembers)]
public class Base
{
public Base(IUsed value)
{
Value = value;
}
public IUsed Value { get; }
}
internal sealed class DeadClass : Base
{
public DeadClass(INotImplemented value)
: base(value)
{
NewValue = value;
}
public INotImplemented NewValue { get; }
}
[UsedImplicitly(ImplicitUseTargetFlags.WithMembers)]
public sealed class OtherCode
{
public Base GetBase(IUsed data)
{
var alwaysNull = data as INotImplemented;
if (alwaysNull != null)
return new DeadClass(alwaysNull);
return new Base(data);
}
}
Expected result
I expect these code inspections to pop up:- alwaysNull is always null
- DeadClass is not used
- INotImplemented is never implemented
Actual result
NothingBut I can safely delete INotImplemented, DeadClass and the 3 first lines of GetBase.