簡體   English   中英

如何在 C# 中的 ref 泛型變量上分配類型特定值?

[英]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;

floatobject的轉換是有效的,從objectT的轉換對所有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轉換為objectobject都為T無效。

暫無
暫無

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

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