Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使对象在比较时充当另一种类型?_C#_.net_C# 4.0 - Fatal编程技术网

C# 如何使对象在比较时充当另一种类型?

C# 如何使对象在比较时充当另一种类型?,c#,.net,c#-4.0,C#,.net,C# 4.0,我不记得如何在C#中将类与基元类型进行比较 范例 public class Validate{ ... //This is here that we would need to add code //if I remember to make the object act as a boolean for example } ... Validate v = new Validate(...); if(v==true) { ... } 你知道它的名字和方法吗?你是说运算符重载吗

我不记得如何在C#中将类与基元类型进行比较

范例

public class Validate{
... //This is here that we would need to add code 
    //if I remember to make the object act as a boolean for example
}

...

Validate v = new Validate(...);
if(v==true)
{
...
}

你知道它的名字和方法吗?

你是说运算符重载吗

public static bool operator == (Validate v, bool value) 
{
    return /* some comparison */
    // or going off of the other posters answer
    return v.IsValid == value; 
}

只需将
IsValid
属性添加到
Validate
类中,并调用该属性:

public class Validate
{
    public bool IsValid
    {
        get { [implementation here] }
    }
}

...

Validate v = new Validate(...);
if(v.IsValid)
{
    ...
}
可以创建隐式运算符,但不建议以这种方式使用它,因为这样会使其他开发人员难以理解您的代码

更新

好的,为了完整性和教育,下面是如何做到的:

public class Validate
{
    public bool IsValid
    {
        get { [implementation here] }
    }

    public static implicit operator bool(Validate v)
    {
        return v.IsValid;
    }
}

但同样,不要这样做。这将使您的代码很难理解。

我想您正在寻找一个新的解决方案

将以下方法添加到Validate类:

    public static implicit operator bool(Validate v)
    {
        // Logic to determine if v is true or false
        return true;
    }

要执行所需操作,需要重写隐式强制转换运算符:

public class MyObject
{
    private int i;

    public MyObject(int i)
    {
        this.i = i;
    }

    public static implicit operator bool(MyObject o)
    {
        return o.i % 2 == 0;
    }
}
如果字段
i
为偶数,则上述示例将计算为真:

MyObject o1 = new MyObject(1);
MyObject o2 = new MyObject(2);

if (o1)
{
    Console.WriteLine("o1");
}

if (o2)
{
    Console.WriteLine("o2");
}
上面的输出为
o2



然而,这是一个有点可怕的实现,因为它会导致混淆代码,因为您的构造读取为
if(object)
,这对大多数读者来说是不熟悉的-
if(object.IsValid)
使意图更加清晰。

他希望能够将类Validate与布尔值进行比较。是的,我知道。我认为可以通过重载
==
来实现这一点=运算符。唯一想到的可能是你期望的行为的复制品?你想自己控制吗?我的意思是,当存在一个对象时,你希望v为真,还是当它符合你的标准时?我希望v与真/假进行比较。我不想使用属性或方法…是的,但您希望True/False代表什么?一个存在的对象可能有错误的值,那么它仍然是“真的”吗?它不允许你做<代码> V==true < /COD>它吗?@菲利普:不,我认为这是一件好事。如果这真的是OP想要的,他应该在
Validate
类型上实现一个
公共静态隐式运算符bool(Validate v)
方法。@Daok:我知道你不想要,但请不要这样做。这正是我想要的!谢谢你,先生@道,我不认为这正是你想要的。不要使用隐式运算符,除非您能够将
Validate
的所有可能值有意义且可靠地映射为
bool
的值。如果您只想执行
==true
==false
,那么我推荐下面hunter提供的操作员过载解决方案。