[c#] 為什麼C#編譯器不是靜態方法調用實例方法的地方的錯誤代碼?


Answers

Foo有一個動態的參數“x”,這意味著Bar(x)是一個動態表達式。

示例具有如下方法是完全可能的:

static Bar(SomeType obj)

在這種情況下,正確的方法將被解決,因此語句Bar(x)完全有效。 有一個實例方法Bar(x)的事實是無關緊要的,甚至沒有考慮到: 根據定義 ,因為Bar(x)是一個動態表達式,所以我們將延遲解析轉換為運行時。

Question

下面的代碼有一個靜態方法Foo() ,調用一個實例方法Bar()

public sealed class Example
{
    int count;

    public static void Foo( dynamic x )
    {
        Bar(x);
    }

    void Bar( dynamic x )
    {
        count++;
    }
}

它編譯時沒有錯誤*,但在運行時生成運行時綁定程序異常。 正如所料,刪除這些方法的動態參數會導致編譯器錯誤。

那麼為什麼有一個動態參數允許編譯代碼? ReSharper也不會將其顯示為錯誤。

編輯1: *在Visual Studio 2008中

編輯2:添加sealed因為子類可能包含靜態Bar(...)方法。 即使是密封版本,也可以在運行時調用實例方法以外的任何方法的情況下進行編譯。




Links