gpt4 book ai didi

c# - 为什么运算符 '==' 不能应用于结构和默认值(结构)?

转载 作者:可可西里 更新时间:2023-11-01 02:59:39 24 4
gpt4 key购买 nike

在结构集合上使用 FirstOrDefault() 后,我看到了一些奇怪的行为。我已将它隔离到这个复制案例中。该程序无法编译

using System;
using System.Linq;

namespace MyProgram {
public class Program {
static void Main() {

var users = new User[] {
new User() { UserGuid = Guid.NewGuid(), Username = "user01" },
new User() { UserGuid = Guid.NewGuid(), Username = "user02" }
};

var user = users.FirstOrDefault(u => u.Username == "user01");
Console.WriteLine(user == default(User) ? "not found" : "found");
}

}

public struct User {
public Guid UserGuid;
public string Username;
}
}

编译器错误是相当神秘的:

Operator '==' cannot be applied to operands of type 'MyProgram.User' and 'MyProgram.User'

将结构更改为类工作正常 - 但我不知道为什么我不能将结构“实例”与默认值进行比较?

最佳答案

对于类,== 运算符使用引用相等性。当然,结构体是值类型,所以不能通过引用来比较。结构没有 == 的默认实现,因为成员比较并不总是有效的比较,具体取决于类型。

您可以改为使用 Object.Equals 方法,该方法会按成员进行比较:

Console.WriteLine(user.Equals(default(User)) ? "not found" : "found");

或者您可以只实现 == 来调用 Object.Equals:

public static bool operator ==(User lhs, User rhs)
{
return lhs.Equals(rhs);
}

但是,结构的 Equals 默认实现使用反射,因此非常慢。最好自己实现 Equals,以及 ==!=(可能还有 GetHashCode) :

public override bool Equals(Object obj)
{
return obj is User && Equals((User)obj);
}

public bool Equals(User other)
{
return UserGuid == other.UserGuid && Username == other.Username;
}

public static bool operator ==(User lhs, User rhs)
{
return lhs.Equals(rhs);
}

public static bool operator !=(User lhs, User rhs)
{
return !lhs.Equals(rhs);
}

关于c# - 为什么运算符 '==' 不能应用于结构和默认值(结构)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20004873/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com