Nested class members should not mask outer class' static members
The C# compiler lets nested class members share names with static members of the outer class, but this is discouraged: it can be unclear which member the inner class code references.
How to fix
Give inner class members unique and descriptive names.
CQLinq source
This rule is written in CQLinq, C# LINQ over the NDepend code model. It ships with every new NDepend project: you can read it, adapt it, or use it as a starting point for your own custom rules.
// <Name>Nested class members should not mask outer class' static members</Name>
// <Id>ND2022:NestedClassMembersShouldNotMaskOutClassStaticMembers</Id>
warnif count > 0
from t in JustMyCode.Types
where t.IsNested && t.ParentType != null
let parentTypesMemberNames = t.ParentType.Members
.Where(pm => pm.IsStatic)
.Select(pm => pm.Name).ToHashSetEx()
from m in t.Members
// Don't warn for these methods and backing fields
where !(m.IsMethod &&
(m.AsMethod.IsConstructor || m.AsMethod.IsClassConstructor ||
m.AsMethod.IsPropertyGetter|| m.AsMethod.IsPropertySetter ||
m.Name == "Dispose()" ||
m.Name.EndsWith("GetEnumerator()"))) &&
!(m.IsField && m.Name.Contains("<"))
&& parentTypesMemberNames.Contains(m.Name)
select new {
m,
isOverlapping = t.ParentType.Members.First(pm => pm.Name == m.Name),
declaredIn = t.ParentType,
Debt = 2.ToMinutes().ToDebt(),
Severity = Severity.Medium
}
//<Expl>
// The {0} should be renamed because it masks the {1} declared
// in the outer {2}.
//</Expl>
//<Desc>
// The C# compiler lets nested class members share names with static members
// of the outer class, but this is discouraged: it can be unclear which
// member the inner class code references.
//</Desc>
//<HowToFix>
// Give inner class members unique and descriptive names.
//</HowToFix>
Open in the interactive Rules Explorer · All default rules
Naming Conventions: all 23 items
- Instance fields naming convention ND2000
- Static fields naming convention ND2001
- Interface name should begin with a 'I' ND2002
- Abstract base class should be suffixed with 'Base' ND2003
- Exception class name should be suffixed with 'Exception' ND2004
- Attribute class name should be suffixed with 'Attribute' ND2005
- Types name should begin with an Upper character ND2006
- Methods name should begin with an Upper character ND2007
- Do not name enum values 'Reserved' ND2008
- Avoid types with name too long ND2009
- Avoid methods with name too long ND2010
- Avoid fields with name too long ND2011
- Avoid having different types with same name ND2012
- Avoid prefixing type name with parent namespace name ND2013
- Avoid naming types and namespaces with the same identifier ND2014
- Don't call your method Dispose ND2015
- Methods prefixed with 'Try' should return a boolean ND2016
- Properties and fields that represent a collection of items should be named Items. ND2017
- DDD ubiquitous language check ND2018
- Avoid fields with same name in class hierarchy ND2019
- Avoid various capitalizations for method name ND2020
- Controller class name should be suffixed with 'Controller' ND2021
- Nested class members should not mask outer class' static members ND2022