C# 通过派生类型调用的静态方法

C# 通过派生类型调用的静态方法,c#,sharpdevelop,C#,Sharpdevelop,有一个类,叫做circle。它包含circleID、circleGeometry和circlePath属性 public class Circle { public string ID {get; set;} public EllipseGeometry circleGeometry {get; set;} public Path circlePath {get; set;} } 现在,我试图为一个圆设置ZIndex值。例如,它将是2 Canvas.SetZIndex

有一个类,叫做circle。它包含circleID、circleGeometry和circlePath属性

public class Circle 
{
    public string ID {get; set;}
    public EllipseGeometry circleGeometry {get; set;}
    public Path circlePath {get; set;}
}
现在,我试图为一个圆设置ZIndex值。例如,它将是2

Canvas.SetZIndex(someCircleID.circlePath,2);
但我有这样的警告:

“通过派生类型调用的静态方法”


有人能解释一下这是什么意思吗?

这意味着方法
SetZIndex
是在类
Canvas
的基类型上定义的,但您使用后者来调用它。您最好使用基类。

是在
面板
类上定义的,该类是
画布
派生的。编译器正在生成一条警告,说明您正在对子类型使用静态方法。这不是一个实际的问题,但以某些方式使用时可能会导致混淆。由于
SetZIndex
返回的是void,所以这应该不是问题

但想象一下:

var ftpRequest = (FtpWebRequest) HttpWebRequest.Create("ftp://my.ftp.com");
Create
实际上是
WebRequest
的一种静态方法,但在
HttpWebRequest
上使用,因为它是派生类型,您可以这样做。所以,您希望它是一个正在生成的web请求,对吗?但它不是,它会生成一个
FtpWebRequest
,因为它是在URI中指定的

编辑:


我想指出的是,一般来说,编译器警告的存在是有原因的,这也是它存在的方式。只要在
Canvas
类中创建的
SetZIndex
没有过载,调用就是安全的。但正如@SriramSakthivel在评论中指出的,如果任何扩展方法或静态方法被添加到
Canvas
类中(使用
new
修饰符),由您或任何其他人执行,它将不再输出所需的结果,您必须意识到这一点。

Canvas
是另一种类型的子类型,
SetZIndex
由后者定义;不是通过
Canvas
。被否决的建议警告不是问题。好的建议是将警告视为错误并加以纠正。@David我没有试图说所有警告都不是问题。他们在那里是为了表明可能出了什么问题。在这种特殊情况下,可以安全地忽略警告。@YuvalItzchakov不,此警告不安全。这可能会导致严重的问题。有关详细信息,请参阅我的答案。@Sriram这是一种假设的边缘情况,在这种情况下,添加静态方法将是对代码的突破性更改。如果yoy采用了静态方法,那么您有责任确保没有破坏任何东西。如果这是一个打破框架的变化,你仍然有责任确保没有任何变化。如果有这样的情况,你不能说“在这种特殊情况下,警告可能会被安全地忽略”