委托函数没有看到 class 对象
delegate function does not see class object
我试图自己做一个委托示例。代表姓名是 MaaşKarşılaştırmaDelegesi
。首先,我尝试比较来自同一个 class(BeyazYaka
或 MaviYaka
)的两个对象的字段("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;
}
更好的方法可能是在运行时简单地检查 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;
}
另一种选择是创建一个接口,该接口具有两个 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; }
}
现在我们可以像这样编写我们的方法,并且可以将 MaviYaka
或 BeyazYaka
类型(或任何其他实现 ICommonYaka
的 class )传递给参数:
public static int KiminMaaşıDahaFazla(ICommonYaka o1, ICommonYaka o2)
{
return o1.maaş > o2.maaş ? 1 : 2;
}
我试图自己做一个委托示例。代表姓名是 MaaşKarşılaştırmaDelegesi
。首先,我尝试比较来自同一个 class(BeyazYaka
或 MaviYaka
)的两个对象的字段("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;
}
更好的方法可能是在运行时简单地检查 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;
}
另一种选择是创建一个接口,该接口具有两个 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; }
}
现在我们可以像这样编写我们的方法,并且可以将 MaviYaka
或 BeyazYaka
类型(或任何其他实现 ICommonYaka
的 class )传递给参数:
public static int KiminMaaşıDahaFazla(ICommonYaka o1, ICommonYaka o2)
{
return o1.maaş > o2.maaş ? 1 : 2;
}