[英]How to assign type specific value on ref generic variable in C#?
讓我們想象一個通用方法:
public void DoSomething<T>(ref T value) where T : struct
{
if(value is float)
{
value = (T)0.5f;
}
}
這行不通。 在網上搜索,我發現解決方法是:
value = (T)(object) 0.5f;
我只是好奇,因為它是裝箱和拆箱值,它不是分配額外的memory,這需要垃圾收集嗎? 沒有其他更好的方法將浮點值分配給泛型變量嗎?
編譯器不一定會考慮運行時會發生什么。 您的if
語句將保證,在運行時,如果T
不是float
但編譯器不考慮這一點, if
塊內的行將永遠不會被執行。 當它評估這一行時:
value = (T)0.5f;
它所關心的只是該演員表是否對所有T
都有效。 不是,所以代碼不會編譯。 在這種情況下:
value = (T)(object) 0.5f;
從float
到object
的轉換是有效的,從object
到T
的轉換對所有T
都有效,因此代碼編譯。 請注意,由於相同的原因,此代碼無法編譯:
public void DoSomething<T>(ref T value) where T : struct
{
if (value is float)
{
value = (T)"Hello World";
}
}
雖然這段代碼確實出於同樣的原因編譯:
public void DoSomething<T>(ref T value) where T : struct
{
if (value is float)
{
value = (T)(object)"Hello World";
}
}
顯然,最后一個片段會在運行時引發異常,但正如我所說,編譯器不會考慮所有潛在的執行路徑以及哪些可以在運行時發生,哪些不能發生。 將string
轉換為T
無效,而將string
轉換為object
和object
都為T
無效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.