【问题标题】: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&lt;T&gt;(T)不需要装箱,因为T可以推断为A,所以该方法在编译时有效为Test2(A)

      但是,因为 Test2&lt;T&gt;(T) 被限制为 IA,所以在该接口上定义的公共成员仍然可以在方法内访问。

      【讨论】:

        猜你喜欢
        • 2011-09-01
        • 1970-01-01
        • 2015-10-18
        • 2022-01-18
        • 2014-04-21
        • 1970-01-01
        • 2013-11-03
        • 2013-03-30
        相关资源
        最近更新 更多