C# 使用泛型在类上的值类型之间强制转换

C# 使用泛型在类上的值类型之间强制转换,c#,generics,C#,Generics,在函数(.NET 2.0)的本节中: public void AttachInput(T输入),其中T:struct { if(输入为int) { 输入。添加((int)输入); } } 编译器显示错误“无法将类型“T”转换为“int”。 因此,我使用了Convert.ToInt32(),这很有效-但它是否将输入框输入到对象?有更好的解决方案吗?谢谢 编辑1:去掉与问题相关的不必要的东西 Edit2:深入研究泛型,在我看来,Convert.ToInt32当T已经是int时,不会对对象进行装箱,

在函数(.NET 2.0)的本节中:

public void AttachInput(T输入),其中T:struct
{
if(输入为int)
{
输入。添加((int)输入);
}
}
编译器显示错误“无法将类型“T”转换为“int”。
因此,我使用了
Convert.ToInt32()
,这很有效-但它是否将
输入框
输入到对象?有更好的解决方案吗?谢谢

编辑1:去掉与问题相关的不必要的东西

Edit2:深入研究泛型,在我看来,
Convert.ToInt32
当T已经是int时,不会对对象进行装箱,并且它的int重载是被调用的


如果这是真的,
Convert
方法在我看来是目前最好的选择

对于类型安全和避免装箱,您唯一的选择是针对
int
类型输入的特定重载:

public void AttachInput(int input)
{
    Inputs.Add(input);
}
更新:

OP用一个理论更新了这个问题:

深入研究泛型,它 在我看来,当 T已经是一个int,不进行装箱 对象及其int重载是 一个正在呼叫

这是不对的,一个简单的测试就可以证明这一点。假设我们编写自己的重载集只是为了检测调用了哪个重载:

public static class OverloadTest
{
    public static void Foo(int x)
    {
        Console.WriteLine("Foo(int)");
    }

    public static void Foo(bool x)
    {
        Console.WriteLine("Foo(bool)");
    }

    public static void Foo(object x)
    {
        Console.WriteLine("Foo(object)");
    }
}
现在我们编写一个通用方法来对问题中的方法进行建模:

static void CallTheRightFoo<T>(T value) where T : struct
{
    OverloadTest.Foo(value);
}
输出为:

Foo(object)
Foo(object)
Foo(object)
要将其与
Convert.ToInt32
关联,您将始终从通用代码调用接受
对象的重载,因此该值将被装箱,然后必须在
Convert.ToInt32
内解除装箱(还必须检查它首先是什么类型)


尽管我要重申这一切背后的一个重要观点:尽管装箱/拆箱比不装箱更昂贵,但与您的代码正在进行的任何实际工作相比,它的成本很可能微不足道。因此,在您能够证明它对ap的现实模型是一个真正的负担之前,我不会太担心它的成本应用程序使用你的库。

我很难想象你将在哪里使用它,你能提供更多的上下文吗?可能通用方法不是最好的方法。我正在做一个操作符类树,它可以根据输入输出值。问题是,这些类可能接受值或引用类型,而我具有另一个功能,即“public void AttachInput(对象输入)”“,我只打算将其用于引用类型。我的目的是区分引用类型和值类型,避免装箱。我已经更新了我的答案,提供了更多关于Convert.ToInt32和装箱理论的信息。好吧,我想我必须这样做,谢谢。不幸的是,在我看来,struct约束的唯一用途是将其与default关键字结合使用,但这只是一个不同的问题基本上
struct
在很多方面都不太有用,无论是作为约束还是定义我们自己的类型。它在理论上具有性能优势,但GC非常好,几乎没有应用程序注意到任何差异。哇,你完全正确。但令人遗憾的是,避免拳击的唯一方法就是制造过载。谢谢
struct Test { } // in order to test a user-defined value type

static void Main(string[] args)
{
    CallTheRightFoo(1);
    CallTheRightFoo(true);
    CallTheRightFoo(new Test());
}
Foo(object)
Foo(object)
Foo(object)