可能重复:
IF structure issue
Logic problem while setting conditions
我有以下代码:
foreach (DataModelObject dmo in allObjects)
{
if (string.Compare(dmo.Name, hostName, true) == 0)
{
if (dmo is IResourcePolicy)
{
IResourcePolicy irp = (IResourcePolicy)dmo;
irp.ResourcePolicy = rp;
irp.AgentPolicyVersion.Version = Convert.ToInt64(policyVersion);
irp.ResourcePolicyEnabled = Convert.ToBoolean(enabled);
irp.AgentVersion = agentVersion;
// Distribute the object without saving it.
SpoServer.Spurt.ServerSendObject(dmo, true, 0);
break;
}
}
}
这里我要分配“irp.AgentVersion = agentVersion;”在主循环之外,如果(dmo是IResourcePolicy)更多地忽略了循环 像这样 如果我这样做
foreach (DataModelObject dmo in allObjects)
{
IResourcePolicy irpa ;
irpa.AgentVersion = agentVersion;
}
我收到错误错误使用未分配的本地变量'irpa'
我该怎么办?
答案 0 :(得分:2)
我不确定你究竟想要实现什么,但这里有一些选择:
如果DataModelObject
类包含AgentVersion
属性,您可以这样做(尽管很可能不是这样):
foreach (DataModelObject dmo in allObjects)
{
dmo.AgentVersion = agentVersion;
}
如果AgentVersion
仅在某些派生类(不是全部)中实现,那么您需要明确检查派生类是否实现了该接口,就像您现在正在做的那样:< / p>
foreach (DataModelObject dmo in allObjects)
{
if (dmo is IResourcePolicy)
{
IResourcePolicy policy = (IResourcePolicy)dmo;
policy.AgentVersion = agentVersion;
}
}
第三种情况是你有几个派生类没有实现相同的接口,但仍然具有AgentVersion
属性。解决这个问题的最简单方法(如果你可以改变源代码)就是让所有这些对象实现相同的接口,包含它们共有的属性:
interface IAgentVersion
{
string AgentVersion { get; }
// omit other properties which are not common to all objects
}
interface IResourcePolicy : IAgentVersion
{
string ResourcePolicy { get; }
// ...
// add all policy-specific properties
}
现在您确定所有IAgentVersion
和IResourcePolicy
对象都实现了该公共属性(AgentVersion
),您只需要检查基接口:
foreach (DataModelObject dmo in allObjects)
{
if (dmo is IAgentVersion)
{
IAgentVersion = (IAgentVersion)dmo;
policy.AgentVersion = agentVersion;
}
}
答案 1 :(得分:1)
我不知道你想要达到的目标。我只能突出你的错误:
foreach (DataModelObject dmo in allObjects)
{
IResourcePolicy irpa ; // <-- declaring but not instantiated or assigned
irpa.AgentVersion = agentVersion; // <-- hence this error...
}
答案 2 :(得分:0)
irpa是一个类的实例,这意味着它是一个引用类型。需要使用new()运算符初始化引用类型变量,或者需要使用'='运算符指向相同类型的现有变量。
IResourcePolicy irpa = new IResourcePolicy() ;
irpa.AgentVersion = agentVersion;
但是,语法表明irpa可能是一个接口 - 它是抽象的,因此不能以这种方式使用