相关疑难解决方法(0)

C#静态成员"继承" - 为什么会存在这种情况?

在C#中,超类的静态成员被"继承"到子类范围中.例如:

class A { public static int M() { return 1; } }
class B : A {}
class C : A { public new static int M() { return 2; } }
[...]
A.M(); //returns 1
B.M(); //returns 1 - this is equivalent to A.M()
C.M(); //returns 2 - this is not equivalent to A.M()
Run Code Online (Sandbox Code Playgroud)

现在,你不能继承静态类,我唯一​​可以想象静态继承可能重要的地方完全忽略它:尽管你可以创建一个通用约束,它需要一个类型参数T作为子类A,你仍然无法调用T.M()(这可能简化了VM的事情,更不用说M在子类中编写不同的实现并使用它.

因此,静态成员的"继承"仅仅看起来像命名空间污染; 即使你明确限定名称(即B.M)A的版本仍然解决.

编辑与命名空间的比较:

namespace N1{  class X();   }
namespace N1.N2 …
Run Code Online (Sandbox Code Playgroud)

c# inheritance static language-design

45
推荐指数
4
解决办法
3万
查看次数

静态/在VB.NET中共享和C#可见性

我面临着VB.NET和C#(.NET2)中的情况,具有静态/共享成员的可见性.在VB.NET中我觉得有点奇怪:

    public class A 
    {
        private static A instance;
        public static A Instance 
        {
            get { return instance; }
        }

        public string Name { get { } }
    }
Run Code Online (Sandbox Code Playgroud)

usage: A.Instance.Name// ONLY名称是"可见的"


VB.NET:

Public Class A
  Private Shared _instance As A

  Public Shared ReadOnly Property Instance() As A
    Get
      Return _instance
    End Get
  End Property


  Public ReadOnly Property Name() As String
    Get
      Return ""
    End Get
  End Property

End Class
Run Code Online (Sandbox Code Playgroud)

用法:

A.Instance.Instance.Instance.Instance...
Run Code Online (Sandbox Code Playgroud)

//共享成员的行为就像一个公共类,我可以重复它到无限...

这是微软的疏忽还是VB.NET的"功能"?

.net c# vb.net accessor visual-studio

9
推荐指数
2
解决办法
3万
查看次数