在我投射之后,我无法设置属性的值.我不确定这是否被称为拳击.
无论如何,新的变量正在设置,但原始的不是.我认为新变量只是对原始变量的引用.但是当我检查intellisence/debug观察器时,原始属性仍为null.
这是代码.
// NOTE: data is either a Foo || FooFoo || FooBar, at this point.
// only Foo impliments ITagElement.
if (data is ITagElement)
{
var tags = ((ITagElement)data).TagList;
// At this point, tags == null and data.TagList == null.
if (tags.IsNullOrEmpty())
{
tags = new List<Tag>();
}
tags.Add(new Tag
{
K = xmlReader.GetAttribute("k"),
V = xmlReader.GetAttribute("v")
});
// At this point, Tags.Count == 1 and data.TagList == null :( :( :(
}
Run Code Online (Sandbox Code Playgroud)
请注意有关该值我行内注释tags和data.TagList?有人可以解释一下我做错了什么吗?我认为变量tags只是属性的引用指针data.TagList..但它看起来不是.
谢谢你们的答案!这是令人尴尬的原因我多年来一直在做这些事情,但仍然忘记/没有注意到这样的简单事情.(当然,现在让我看到了光明).
Marc得到了积分,因为他的答案(IMO)对我的单个金发脑细胞来说是最简单的.
谢谢大家!
Mar*_*ell 10
标签和数据是完全孤立的变量.仅仅因为你指定了一个对象tags,这对变量 没有任何影响data.
您感到困惑的是,当两个变量指向同一个对象时,将通过任一变量看到对(单个)对象的更改.
基本上,如果data启动非null,则有
在这种情况下,将对象添加到任一对象data或tags实际上是将对象添加到相同的"列表A"
但是,如果data启动为null,则您具有:
然后你分配tags,给予:
您必须手动分配"列表B" data才能使其坚持下去.
但是,有一种方法可以使它(分配接口/对象)工作:ref和泛型:
using System.Collections.Generic;
using System;
class Foo : IBar
{
List<string> list = new List<string>();
public int Count { get { return list.Count; } }
void IBar.Add(string s) { list.Add(s); }
}
interface IBar
{
void Add(string s);
}
static class Program
{
static void Main()
{
Foo foo = null; // note foo starts as null
CreateAndAdd(ref foo, "abc");
Console.WriteLine(foo.Count); // prove non-null and added
}
static void CreateAndAdd<T>(ref T data, string s) where T : IBar, new()
{
if (data == null) { data = new T(); } // create
data.Add(s); // mutate
}
}
Run Code Online (Sandbox Code Playgroud)