구조체 컬렉션에서 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;
}
}
컴파일되지 않습니다 :
유형 'MyProgram.User'와 'MyProgram.User'의 피연산자에 적용 할 수 없습니다 연산자 '=='
구조체를 클래스로 변경하면 문제가 없지만 기본적으로 구조체 '인스턴스'를 비교할 수없는 이유는 무엇입니까? 당신이 ==
을 무시할 경우이
public static bool operator ==(User u1, User u2)
{
return u1.Equals(u2)
}
또한 또한 Equals
및 GetHashCode()
를 오버라이드 (override) 할 필요가 수행하려는 경우
클래스의 경우 포인터 비교를 수행하기 때문에. 구조체에 대해서는 정의되지 않았다. (구현 자에 의해 정의되지 않았다면 확장 된 반사 비교를해야하기 때문이다.) 구조체에 클래스가 포함되어 있는지 생각해보십시오 (가능한 경우). 이 경우 비교를 수행해야합니다 (각 클래스에 대해 비교 연산자를 호출하여 참조 만하면됩니다). 구조체에 큰 데이터 배열이 포함되어 있다면 생각해보십시오 (좋지 않은 나쁜 습관이지만 허용되고 책임감 있음). 어떤 컴파일러가이를 방출해야합니까? 그 이유로 ** IMO는 Equals()를 호출조차도 꽤 비효율적입니다 **. –
가능한 중복 [==]를 사용하여 두 구조체 비교 (0120-99026/comparing-two-structs-using) – Stijn
어쨌든 클래스 대신 구조체를 사용하고 있습니까? (나는 당신의 결정에 의문을 제기하지 않고 단지 그것에 대해 생각하고 그 차이를 이해하는지 궁금해합니다.) –