委托函数没有看到 class 对象

delegate function does not see class object

我试图自己做一个委托示例。代表姓名是 MaaşKarşılaştırmaDelegesi。首先,我尝试比较来自同一个 class(BeyazYakaMaviYaka)的两个对象的字段("maaş"),它运行良好。但是后来我想比较来自不同 classes 的两个对象(一个来自 MaviYaka,一个来自 BeyazYaka),但是随后,在程序 class 的委托函数中,编译器给出错误提示:

The name 'k1' does not exist in the current context

The name 'k2' does not exist in the current context

所以编译器看不到创建的class对象。我认为错误出在 if else 块中。因为当我尝试移除块并写入时;

MaviYaka k1 = (MaviYaka)o1;

BeyazYaka k2 = (BeyazYaka)o2;

错误已删除。但是当它在 if 块中时它会出错。 你能帮我看看为什么会这样吗?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace tekrar_delegates
{
    class MaviYaka
    {
    public int maaş;

    public MaviYaka(int maaş)
    {
        this.maaş = maaş;
    }

    public static int KiminMaaşıDahaFazla(object o1, object o2) 
    {
        MaviYaka m1 = (MaviYaka)o1;
        MaviYaka m2 = (MaviYaka)o2;

        if (m1.maaş > m2.maaş) { return 1; }
        else { return 2; }
    }

}

class BeyazYaka
{
    public int maaş;

    public BeyazYaka(int maaş)
    {
        this.maaş = maaş;
    }

    public static int KiminMaaşıDahaFazla(object o1, object o2) 
    {
        BeyazYaka b1 = (BeyazYaka)o1;
        BeyazYaka b2 = (BeyazYaka)o2;

        if (b1.maaş > b2.maaş) { return 1; }
        else { return 2; }
    }
}

class Pair
{
    private object[] thePair = new object[2];

    public Pair(object o1, object o2)
    {
        thePair[0] = o1;
        thePair[1] = o2;
    }

    public delegate int MaaşKarşılaştırmaDelegesi(object o1, object o2);

    public void Print(MaaşKarşılaştırmaDelegesi delegatedFunc)
    {
        if (delegatedFunc(thePair[0], thePair[1]) == 1) { Console.WriteLine("1.nin maaşı daha büyük."); }
        else { Console.WriteLine("2.nin maaşı daha büyük."); }
    }

}

class Program
{
    public static int KiminMaaşıDahaFazla(object o1, object o2)
    {
        if (true)
        {
            MaviYaka k1 = (MaviYaka)o1;
        }
        else { }
        if (true)
        {
            BeyazYaka k2 = (BeyazYaka)o2;
        }
        else { }

        if (k1.maaş > k2.maaş) { return 1; }
        else { return 2; }
    }



    static void Main(string[] args)
    {
        MaviYaka maviYaka1 = new MaviYaka(300);            

        BeyazYaka beyazYaka1 = new BeyazYaka(500);            

        Pair karışıkPair = new Pair(maviYaka1, beyazYaka1);            

        Pair.MaaşKarşılaştırmaDelegesi karışıkDelege = new Pair.MaaşKarşılaştırmaDelegesi(KiminMaaşıDahaFazla);

        karışıkPair.Print(karışıkDelege);     

        Console.Read();
    }
}

当您在 if 块中定义一个变量时,它的范围仅限于该代码块,并且当该代码块结束时它实际上消失了。

为避免此特定错误,您可以将代码更改为:

public static int KiminMaaşıDahaFazla(object o1, object o2)
{
    // We need to define k1 and k2 outside of the if block 
    // in order to use them outside of the if block
    MaviYaka k1 = null;
    BeyazYaka k2 = null;

    if (true)
    {
        k1 = (MaviYaka) o1;
    }
    else { }
    if (true)
    {
        k2 = (BeyazYaka) o2;
    }
    else { }

    if (k1.maaş > k2.maaş) { return 1; }
    else { return 2;}
}

此外,使用 if (true) { // do something } else {} 没有意义,尽管我假设它是出于某些测试目的而存在的,但是您的整个方法可以简化为一行:

public static int KiminMaaşıDahaFazla(object o1, object o2)
{
    return ((MaviYaka)o1).maaş > ((BeyazYaka)o2).maaş ? 1 : 2;
}

更好的方法可能是在运行时简单地检查 o1o2 的类型,然后从对象中获取 属性 值。

例如:

public static int KiminMaaşıDahaFazla(object o1, object o2)
{
    // I've assumed the type is 'int'; change to the correct type if needed
    int k1_maaş = 0;
    int k2_maaş = 0;

    // Check the type of object and assign our variables as appropriate
    if (o1 is MaviYaka) k1_maaş = ((MaviYaka) o1).maaş;
    else if (o1 is BeyazYaka) k1_maaş = ((BeyazYaka) o1).maaş;

    if (o2 is MaviYaka) k1_maaş = ((MaviYaka) o2).maaş;
    else if (o2 is BeyazYaka) k1_maaş = ((BeyazYaka) o2).maaş;

    return k1_maaş > k2_maaş ? 1 : 2;
}

另一种选择是创建一个接口,该接口具有两个 classes 之间的共同属性,在两个 classes 上实现该接口,然后让此方法接受两个参数接口类型:

例如:

public interface ICommonYaka
{
    int maaş { get; set; }
}
public class MaviYaka : ICommonYaka
{
    public int maaş { get; set; }
}
public class BeyazYaka : ICommonYaka
{
    public int maaş { get; set; }
}

现在我们可以像这样编写我们的方法,并且可以将 MaviYakaBeyazYaka 类型(或任何其他实现 ICommonYaka 的 class )传递给参数:

public static int KiminMaaşıDahaFazla(ICommonYaka o1, ICommonYaka o2)
{
    return o1.maaş > o2.maaş ? 1 : 2;
}