如果 class 嵌套了同名的 class,则无法访问继承的 属性
Cannot access inherited property if class has nested class of same name
我想访问我的某些 class 的 属性,但出现编译器错误“CS0572 - 无法通过表达式引用类型”。
我有以下设置
public interface IHelper {
void DoHelp();
}
public abstract class ClassWithHelperBase<THelper> where THelper : IHelper {
public THelper Helper { get; }
}
public class ClassWithHelper : ClassWithHelperBase<ClassWithHelper.Helper> {
// use a nested class, since there will be n classes deriving from ClassWithHelper and giving each helper a readable name (in this example ClassWithHelperHelper) is ugly
public class Helper : IHelper {
public static void SomeStaticMethod() { }
public void DoHelp() { }
}
}
public class Test {
private ClassWithHelper myClass;
public void DoTest() {
((ClassWithHelperBase<ClassWithHelper.Helper>) myClass).Helper.DoHelp(); // this works, but is ugly
myClass.Helper.DoHelp(); // what I want, but it's not working
//myClass.Helper.SomeStaticMethod(); // funnily IDE supposes static methods here even though the resulting code is invalid, since I am (obviously) not referencing the class type
}
}
复制不需要界面,为了清楚起见,我添加了它。
注意:我不想调用静态方法,我只是添加了它,以显示 IDE 混淆了成员和 class 限定符。
有没有办法访问 myClass
的 属性 Helper
,而无需转换 myClass
或重命名嵌套的 class?
又名:为什么编译器无法区分成员和嵌套 class?
问题是由于 Helper
class(类型)和 Helper
属性 之间的名称冲突造成的。试试这个
public interface IHelper
{
void DoHelp();
}
public abstract class ClassWithHelperBase<THelper> where THelper : IHelper
{
public THelper Helper { get; set; }
}
public class ClassWithHelper : ClassWithHelperBase<ClassWithHelper.CHelper>
{
// use a nested class, since there will be n classes deriving from ClassWithHelper and giving each helper a readable name (in this example ClassWithHelperHelper) is ugly
public class CHelper : IHelper
{
public static void SomeStaticMethod() {}
public void DoHelp() { }
}
}
public class Test
{
private ClassWithHelper myClass;
public void DoTest() {
myClass.Helper.DoHelp();
ClassWithHelper.CHelper.SomeStaticMethod();
}
}
在这里,我将 Helper
class 重命名为 CHelper
,因此编译器现在可以区分 class 和 属性,从而区分行 myClass.Helper.DoHelp();
现在无需转换即可工作。
如果“不重命名嵌套 class”要求是绝对强制性的,那么问题也可以通过重命名基础 class 中的助手 属性 来避免名称来解决碰撞。但是,我想不出更好的名字 属性.
不幸的是,对于静态方法,您不能引用 myClass
实例。因此,您需要引用整个类型。
我想访问我的某些 class 的 属性,但出现编译器错误“CS0572 - 无法通过表达式引用类型”。
我有以下设置
public interface IHelper {
void DoHelp();
}
public abstract class ClassWithHelperBase<THelper> where THelper : IHelper {
public THelper Helper { get; }
}
public class ClassWithHelper : ClassWithHelperBase<ClassWithHelper.Helper> {
// use a nested class, since there will be n classes deriving from ClassWithHelper and giving each helper a readable name (in this example ClassWithHelperHelper) is ugly
public class Helper : IHelper {
public static void SomeStaticMethod() { }
public void DoHelp() { }
}
}
public class Test {
private ClassWithHelper myClass;
public void DoTest() {
((ClassWithHelperBase<ClassWithHelper.Helper>) myClass).Helper.DoHelp(); // this works, but is ugly
myClass.Helper.DoHelp(); // what I want, but it's not working
//myClass.Helper.SomeStaticMethod(); // funnily IDE supposes static methods here even though the resulting code is invalid, since I am (obviously) not referencing the class type
}
}
复制不需要界面,为了清楚起见,我添加了它。
注意:我不想调用静态方法,我只是添加了它,以显示 IDE 混淆了成员和 class 限定符。
有没有办法访问 myClass
的 属性 Helper
,而无需转换 myClass
或重命名嵌套的 class?
又名:为什么编译器无法区分成员和嵌套 class?
问题是由于 Helper
class(类型)和 Helper
属性 之间的名称冲突造成的。试试这个
public interface IHelper
{
void DoHelp();
}
public abstract class ClassWithHelperBase<THelper> where THelper : IHelper
{
public THelper Helper { get; set; }
}
public class ClassWithHelper : ClassWithHelperBase<ClassWithHelper.CHelper>
{
// use a nested class, since there will be n classes deriving from ClassWithHelper and giving each helper a readable name (in this example ClassWithHelperHelper) is ugly
public class CHelper : IHelper
{
public static void SomeStaticMethod() {}
public void DoHelp() { }
}
}
public class Test
{
private ClassWithHelper myClass;
public void DoTest() {
myClass.Helper.DoHelp();
ClassWithHelper.CHelper.SomeStaticMethod();
}
}
在这里,我将 Helper
class 重命名为 CHelper
,因此编译器现在可以区分 class 和 属性,从而区分行 myClass.Helper.DoHelp();
现在无需转换即可工作。
如果“不重命名嵌套 class”要求是绝对强制性的,那么问题也可以通过重命名基础 class 中的助手 属性 来避免名称来解决碰撞。但是,我想不出更好的名字 属性.
不幸的是,对于静态方法,您不能引用 myClass
实例。因此,您需要引用整个类型。