首页 > 解决方案 > 委托函数看不到类对象

问题描述

我试图自己做一个代表的例子。代表姓名是MaaşKarşılaştırmaDelegesi。首先,我尝试比较来自同一类(要么是要么)的两个对象的字段(即“maaş”)BeyazYakaMaviYaka它运行良好。但是后来我想比较来自不同类的两个对象(一个来自MaviYaka和一个来自BeyazYaka)但是,在 Program 类的委托函数内部,编译器给出了一个错误消息:

当前上下文中不存在名称“k1”

当前上下文中不存在名称“k2”

所以编译器看不到创建的类对象。我认为错误在 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();
    }
}

标签: c#delegates

解决方案


当您在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;
}

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

例如:

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)传递给任一参数:

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

推荐阅读