c# - 委托函数看不到类对象
问题描述
我试图自己做一个代表的例子。代表姓名是MaaşKarşılaştırmaDelegesi
。首先,我尝试比较来自同一类(要么是要么)的两个对象的字段(即“maaş”)BeyazYaka
,MaviYaka
它运行良好。但是后来我想比较来自不同类的两个对象(一个来自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();
}
}
解决方案
当您在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;
}
更好的方法可能是在运行时简单地检查 和 的类型,o1
并o2
以这种方式从对象中获取属性值。
例如:
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; }
}
现在我们可以像这样编写我们的方法,并且可以将一个MaviYaka
或BeyazYaka
类型(或任何其他实现的类ICommonYaka
)传递给任一参数:
public static int KiminMaaşıDahaFazla(ICommonYaka o1, ICommonYaka o2)
{
return o1.maaş > o2.maaş ? 1 : 2;
}
推荐阅读
- .net - .NET 4.5 DLL 访问 SOAP 1.2 服务的身份验证问题
- r - R,如何在按组拆分的值之后和/或之间保留行?
- powershell - 计算虚拟桌面然后删除超过 2 个
- javascript - 如何使 MongoDB 中的值仅设置一次?
- r - 在 ggplot2 - 2021 中复制和编辑离散轴
- html - 将 div 放置在底部,并在其上滚动兄弟
- html - Bootstrap 5轮播没有按预期工作
- javascript - document.getElementsByClassName('').innerHTML 不起作用
- python - Python如何使日期时间更新时间
- discord - VPS 上的 Discord.js Reactionroles 不起作用