如果我嘗試從類到接口的無效轉換,那麼編譯器不會抱怨(錯誤發生在運行時);它確實抱怨,但是,如果我嘗試類似演員抽象類。爲什麼沒有編譯器錯誤,當我將一個類轉換爲它沒有實現的接口?
class Program
{
abstract class aBaz
{
public abstract int A { get; }
}
interface IBar
{
int B { get; }
}
class Foo
{
public int C { get; }
}
static void Main()
{
Foo foo = new Foo();
// compiler error, as expected, since Foo doesn't inherit aBaz
aBaz baz = (aBaz)foo;
// no compiler error, even though Foo doesn't implement IBar
IBar bar = (IBar)foo;
}
}
爲什麼不編譯器拒絕來自富到伊巴爾投,當它的(貌似?)無效?或者,如果編譯器允許這個「無效」強制轉換到接口IBar,爲什麼它不允許類似的「無效」強制轉換爲抽象類aBaz?
http://blogs.msdn.com/b/ericlippert/archive/2009/03/19/representation-and-identity.aspx – SLaks
這個鑄造到一個接口位在我今晚的對接......和男孩它受傷了。 –
您沒有將'Foo'標記爲'sealed'。因此,明確的演員應編制。可能存在一個從'Foo'繼承的類,它還執行'IBar'。如果你使用'密封類Foo',在編譯時對'IBar'的轉換是非法的。 (在這種情況下,類Foo是嵌套的,所以即使必須允許強制轉換,也可以設想C#編譯器可以給出_warning_(不是錯誤,因爲該規範說顯式轉換存在),因爲它可以看到嵌套類的全部範圍,但這可能是一種罕見的情況。)_編輯:_我現在看到這在下面的阿列克謝覆蓋。 –