2011-06-08 26 views
24

這是錯誤的:typeof(double).IsAssignableFrom(typeof(int))爲什麼IsAssignableFrom()不適用於int和double?

這是錯誤的:typeof(int).IsAssignableFrom(typeof(double))

但這個工程:

​​

顯然double分配從int但框架IsAssignableFrom()得到它錯了。

爲什麼?或者這是一個.NET中的錯誤,由int和double的特殊性質造成,它們沒有繼承關係,但是可以分配(在一個方向上)?

+1

我想它沒有考慮到隱式轉換。 – 2011-06-08 07:55:26

+0

從[IsAssignableFrom MSDN page](http://msdn.microsoft.com/en-us/library/system.type.isassignablefrom.aspx): 如果c和當前類型表示相同類型,則返回「true」或者當前Type是否在c的繼承層次結構中,或者當前Type是否是c實現的接口,或者如果c是泛型類型參數,並且當前Type是c。false中的一個約束,如果它們中沒有一個條件是真的,或者如果c是空引用。「 – bentayloruk 2011-06-08 07:58:46

+0

謝謝大家;我已經向MSDN添加了一個社區註釋,使得這個隱藏的推論更清晰一些,以免其他人愚蠢地認爲方法名稱意味着它的含義。我猜'Type.IsSomewhatAssignableFrom'本來就太長了:) – 2011-06-08 08:14:17

回答

22

C#提供從intdouble的隱式轉換。這是一個語言的決定,而不是.NET將爲您做的事情......所以從.NET的角度來看,double不是可從int轉讓。

(截至爲什麼這是特定於語言的一個例子,F#你這樣不執行隱式轉換 - 你需要明確指定的轉換。)

值得看爲Type.IsAssignableFrom文檔(爲了便於閱讀非常微微編):

返回true,如果c和當前Type表示相同的類型,或者如果當前類型是在C的繼承層次結構,或者如果當前類型是一個c實現的接口,或者c是泛型類型參數和當前類型repr提出了c的約束之一。如果這些條件都不爲真或者c爲null,則返回false。

現在應用,爲doubleint,你會看到它應該返回false。

+1

IsAssignableFrom()是語言特徵還是框架特徵?如果它是一種語言功能,爲什麼它不按它名字的名稱來做呢?是的,如果你閱讀MSDN上的小字,它實際上從來沒有說它會檢查可分配性,但名稱會誤導它認爲它應該。 – 2011-06-08 08:01:03

+5

@Hightechrider:這是一個方法調用(而不是任何語言特定的命名空間),所以它顯然是一個框架功能。 – 2011-06-08 11:20:26

相關問題