Struct C#7之后的结构上的ReferenceEquals

Struct C#7之后的结构上的ReferenceEquals,struct,c#-7.0,Struct,C# 7.0,由于C#7.2,可以在结构上使用“ref”关键字来创建嵌入引用。如何确定两个结构变量是否指向同一引用ReferenceEquals始终返回false: 样本代码: struct MyStruct { public string Name { get; set; } } static void Main(string[] args) { MyStruct val1 = new MyStruct() { Name = "Value1" }; MyStruct val2 =

由于C#7.2,可以在结构上使用“ref”关键字来创建嵌入引用。如何确定两个结构变量是否指向同一引用
ReferenceEquals
始终返回
false

样本代码:

struct MyStruct
{
    public string Name { get; set; }
}

static void Main(string[] args)
{
    MyStruct val1 = new MyStruct() { Name = "Value1" };
    MyStruct val2 = new MyStruct() { Name = "Value2" };
    MyStruct val4 = new MyStruct() { Name = "New name" };

    ref var val3 = ref val1;

    val1.Name = "New name";

    Console.WriteLine("Val 1: " + val1.Name);
    Console.WriteLine("Val 2: " + val2.Name);
    Console.WriteLine("Val 3: " + val3.Name);

    Console.WriteLine("Val3 eq Val1: " + val3.Equals(val1));
    Console.WriteLine("Val3 eq Val2: " + val3.Equals(val2));
    Console.WriteLine("Val3 eq Val4: " + val3.Equals(val4));

    Console.WriteLine("Val3 ref eq Val1: " + object.ReferenceEquals(val3, val1));
    Console.WriteLine("Val3 ref eq Val2: " + object.ReferenceEquals(val3, val2));

    Console.ReadKey();
}
输出:

Val 1:新名称
值2:值2
Val 3:新名称
Val3 eq Val1:正确
Val3-eq-Val2:False
Val3 eq Val4:正确
Val3 ref eq Val1:False看看

ref struct是堆栈唯一的值类型,它:

表示顺序结构布局; 只能在堆栈中使用。i、 e.方法参数和局部变量; 不能是类或普通结构的静态成员或实例成员; 不能是异步方法或lambda表达式的方法参数; 不能是动态绑定、装箱、取消装箱、包装或转换

(强调矿山)

他接着实现了
Equals
作为

public ref struct MyRefStruct
{
    [EditorBrowsable(EditorBrowsableState.Never)]
    public override bool Equals(object obj) => throw new NotSupportedException();

    // ...
}
有理由

请注意,我已经重写了从System.Object继承的Equals、GetHashCode和ToString方法。因为ref结构不允许装箱,所以您将无法调用这两个基本方法

还请注意

ref结构类型的值不能装箱:

[……] 任何在object或System.ValueType中声明但未在ref struct类型中重写的实例方法都不能用该ref struct类型的接收器调用

也就是说,虽然您可以实现
ref struct MyEmbeddedStruct{public override bool Equals(object obj)=>true;}
但只能通过
val3.Equals(/*…*/)
调用它,而不能通过
object.ReferenceEquals()
调用它。您不能将参数
obj
提供给
Equals
,因为您必须将参数框起来


因此,您的问题的答案可能是:您无法确定两个(嵌入式)结构是否指向同一引用。(当你处理两个正常结构时,这个问题在一开始就没有任何意义。)

Eric Lippert的这篇文章只是关于“正常”结构,但它可能仍然值得一读:ref structs是C#7.2(),我认为问题在于,这个对象。ReferenceEquals(val3,val1)正在装箱我的值,所以我真正应该调用的是类似于
struct.ReferenceEquals(ref-val3,ref-val1)
-如果存在类似的东西。。。