© 2026 Hedgehog Software, LLC

TwitterGitHubDiscord
More
CommunitiesDocsAboutTermsPrivacy
Search
Star
Setup for Free
C#C
C#•2y ago•
3 replies
teadrinker

Avoiding boxing (causing many small allocations) in generic classes

Can the compiler or runtime optimization avoid trivial boxing like (T)(object)?

Example below (simplified, real case would have more types and more functionality which makes non-generic solution cause a lot of code duplication)
interface IValueWrap
{
    void SetFloatValue(float v);
    void SetValue(object v);
}
public class ValueWrap<T> : IValueWrap
{
    public T val;
    public void SetValue(object v)
    {
        val = (T)System.Convert.ChangeType(v, typeof(T));
    }
    public void SetFloatValue(float v)
    {
        // val = val switch
        // {
        //    float f => v,  // Error: Cannot implicitly convert type 'float' to 'T'
        //    _ => (T) System.Convert.ChangeType(v, typeof(T))
        // };

        // switch (val)
        // {
        //    case float floatVal: val = v; break;  // Error: Cannot implicitly convert type 'float' to 'T'
        //    default: SetValue(val); break; 
        // }

        if (typeof(T) == typeof(float))
        {
            // val = v;          // Error: Cannot implicitly convert type 'float' to 'T'
            // val = (T) v;      // Error: Cannot convert type 'float' to 'T'
            // Set(v);           // Error: ... There is no boxing conversion from 'float' to 'T'
            val = (T)(object)v;  // Works, but how can I avoid boxing/unboxing to object?
        }
        else
            SetValue(v);
    }
    public void Set<T2>(T2 v) where T2 : T
    {
        val = v;
    }
}
interface IValueWrap
{
    void SetFloatValue(float v);
    void SetValue(object v);
}
public class ValueWrap<T> : IValueWrap
{
    public T val;
    public void SetValue(object v)
    {
        val = (T)System.Convert.ChangeType(v, typeof(T));
    }
    public void SetFloatValue(float v)
    {
        // val = val switch
        // {
        //    float f => v,  // Error: Cannot implicitly convert type 'float' to 'T'
        //    _ => (T) System.Convert.ChangeType(v, typeof(T))
        // };

        // switch (val)
        // {
        //    case float floatVal: val = v; break;  // Error: Cannot implicitly convert type 'float' to 'T'
        //    default: SetValue(val); break; 
        // }

        if (typeof(T) == typeof(float))
        {
            // val = v;          // Error: Cannot implicitly convert type 'float' to 'T'
            // val = (T) v;      // Error: Cannot convert type 'float' to 'T'
            // Set(v);           // Error: ... There is no boxing conversion from 'float' to 'T'
            val = (T)(object)v;  // Works, but how can I avoid boxing/unboxing to object?
        }
        else
            SetValue(v);
    }
    public void Set<T2>(T2 v) where T2 : T
    {
        val = v;
    }
}
C# banner
C#Join
We are a programming server aimed at coders discussing everything related to C# (CSharp) and .NET.
61,871Members
Resources

Similar Threads

Was this page helpful?
Recent Announcements

Similar Threads

Boxing
C#CC# / help
14mo ago
❔ ViewModel normally how many classes?
C#CC# / help
3y ago
✅ Issues with interfaces and generic classes
C#CC# / help
3y ago