簡體   English   中英

C#中的類型推斷不起作用?

[英]Type inference in C# not working?

給出以下C#代碼:

var a = new[] {"123", "321", 1}; //no best type found for implicitly typed array

與VB.NET中的對應物:

Dim a = {"123", "321", 1} 'no errors

似乎VB.NET能夠正確地推斷a = Object() ,而C#會抱怨,直到上面的內容被修復為:

var a = new object[] {"123", "321", 1};

有沒有辦法在上述場景中自動推斷C#中的類型?

編輯:在C#沙箱中使用不同類型后的有趣觀察 - 如果所有元素在繼承樹中具有共同父項,並且該父項不是 Object ,或者如果元素可以轉換為更寬泛的類型(無損失),則可以正確推斷類型精度,例如Integer -> Double )。 所以這兩個都可行:

var a = new[] {1, 1.0}; //will infer double[]
var a = new[] {new A(), new B()}; //will infer A[], if B inherits from A

我認為這種行為在C#中是不一致的,因為所有類型都繼承自Object ,所以它與其他任何類型的祖先都沒有太大不同。 這可能是一個設計,所以沒有必要爭論,但如果你知道原因,知道原因會很有趣。

否.C#中的隱式類型數組要求數組初始值設定項中某個表達式的類型是目標類型。 基本上,編譯器試圖找到恰好一個元素類型,以便可以將所有其他類型轉換為它。

您當然可以將任何元素轉換為object

var a = new[] { (object) "123", "321", 1}; 

...但是你可能只使用一個顯式類型的數組初始值設定項:

var a = new object[] {"123", "321", 1}; 

或者在您確實同時聲明變量的情況下:

object[] a = {"123", "321", 1};

不可以。但是,通過使用Option Explicit On,Option Strict On和Option Infer Off,可以使VB更像C#。

最佳實踐:選項推斷

在C#中你可以使用dynamicdynamic[] k = { "1", 2, "3" };

但它並不完全模仿VB的行為。 dynamic[] k = { "1", "2", "3" }; 仍然給你一個對象數組,而在VB中你得到一個String數組。

而且當然:

dynamic[] k = { "1", "3", "3" };
int i = k[0].I_do_not_exist();

編譯沒有問題,但很可能會悲慘地失敗;)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM