函数调用之间有什么区别?

时间:2021-07-14 15:15:22

标签: c# generics interface

主要区别是什么?我是新手,刚刚开始泛型。两种方法在做同样的事情。我听说过强制转换,但不确定它在这里是如何工作的。

public interface IA
{
}

public struct A : IA
{
}

public static void Test1(IA obj)
{
}

public static void Test2<T>(T obj) where T : IA
{
}

static void Main(string[] args)
{
    var a = new A();
        
    Test1(a);
    Test2(a);
}

感谢所有帮助:)

2 个答案:

答案 0 :(得分:1)

这两种方法都接受 IA,但通用方法知道要传递的真实对象。

考虑如果从函数返回 obj 会发生什么:

public static IA Test1(IA obj)
{
    return obj;
}

public static T Test2<T>(T obj) where T : IA
{
    return obj
}

非泛型只能返回一个 IA 接口,因为这就是它的全部。

另一方面,泛型可以返回一个具体的对象,并且对于它被调用的每种不同类型的对象有效地变成一种不同的方法:

static void Main(string[] args)
{
    var a = new A();
    var b = new B(); //also implements IA
    
    IA ret1 = Test1(a); // this can only return an IA
    A ret2A = Test2(a); // this returns an A 
    B ret2B = Test2(b); // this returns a B! It's effectively a different function
}

答案 1 :(得分:0)

因为 A 是一个结构体,将 a 传递给 Test1(IA) 会导致值为 boxed,因为接口是引用类型。

将其传递给 Test2<T>(T) 不需要装箱,因为 T 可以推断为 A,因此该方法在编译时是有效的 Test2(A)

但是,由于 Test2<T>(T) 被限制为 IA,因此在该接口上定义的公共成员仍可在该方法中访问。

相关问题