【问题标题】:what's the difference between function calls?函数调用之间有什么区别?
【发布时间】:2021-07-14 15:15:22
【问题描述】:
主要区别是什么?我是新手,刚开始使用泛型。两种方法在做同样的事情。我听说过强制转换,但不确定它在这里是如何工作的。
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);
}
感谢所有帮助:)
【问题讨论】:
标签:
c#
generics
interface
【解决方案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
}
【解决方案2】:
因为A 是一个结构,将a 传递给Test1(IA) 会导致值为boxed,因为接口ae 引用类型。
将其传递给Test2<T>(T)不需要装箱,因为T可以推断为A,所以该方法在编译时有效为Test2(A)。
但是,因为 Test2<T>(T) 被限制为 IA,所以在该接口上定义的公共成员仍然可以在方法内访问。