Skip to content

Commit 3a998b0

Browse files
authored
Don't allow setting Variant to Variant (#38592)
* Don't allow setting Variant to Variant * pr fb
1 parent 9128b31 commit 3a998b0

File tree

2 files changed

+62
-2
lines changed

2 files changed

+62
-2
lines changed

sdk/core/Azure.Core.Experimental/src/Variant/Variant.cs

+10-2
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,16 @@ public readonly partial struct Variant
2222
/// <param name="value"></param>
2323
public Variant(object? value)
2424
{
25-
_object = value;
26-
_union = default;
25+
if (value is Variant variant)
26+
{
27+
_object = variant._object;
28+
_union = variant._union;
29+
}
30+
else
31+
{
32+
_object = value;
33+
_union = default;
34+
}
2735
}
2836

2937
/// <summary>

sdk/core/Azure.Core.Experimental/tests/Variant/VariantUsage.cs

+52
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,58 @@ public void CanGetAsString(Variant v, Variant s)
3939
Assert.AreEqual(value, v.ToString());
4040
}
4141

42+
[Test]
43+
public void VariantDoesntStoreVariant()
44+
{
45+
Variant a = new("hi");
46+
Variant b = new(a);
47+
48+
Assert.AreEqual(a, b);
49+
Assert.AreEqual(typeof(string), b.Type);
50+
}
51+
52+
[Test]
53+
public void VariantAssignmentHasReferenceSemantics()
54+
{
55+
// Variant should use reference semantics with reference types
56+
// so that it behaves like object in these cases.
57+
//
58+
// e.g. since:
59+
// List<string> list = new List<string> { "1" };
60+
// object oa = list;
61+
// object ob = oa;
62+
// list[0] = "2";
63+
//
64+
// Assert.AreEqual("2", list[0]);
65+
// Assert.AreEqual("2", ((List<string>)oa)[0]);
66+
// Assert.AreEqual("2", ((List<string>)ob)[0]);
67+
//
68+
// Variant should do the same.
69+
// The following test validates this functionality.
70+
71+
List<string> list = new List<string> { "1" };
72+
Variant a = new(list);
73+
74+
Assert.AreEqual("1", list[0]);
75+
Assert.AreEqual("1", a.As<List<string>>()[0]);
76+
77+
list[0] = "2";
78+
79+
Assert.AreEqual("2", list[0]);
80+
Assert.AreEqual("2", a.As<List<string>>()[0]);
81+
82+
Variant b = new(a);
83+
84+
Assert.AreEqual(a, b);
85+
Assert.AreEqual("2", b.As<List<string>>()[0]);
86+
87+
list[0] = "3";
88+
89+
Assert.AreEqual("3", list[0]);
90+
Assert.AreEqual("3", a.As<List<string>>()[0]);
91+
Assert.AreEqual("3", b.As<List<string>>()[0]);
92+
}
93+
4294
#region Helpers
4395
public static IEnumerable<Variant[]> VariantValues()
4496
{

0 commit comments

Comments
 (0)