首页 > 解决方案 > 无法从 void 类型隐式转换为 Systems.Collections.Generics.List<>

问题描述

我正在尝试使用 string.Equals 将新对象添加到对象列表中,并出现如下转换错误

这是我的对象:

public class TestNode : CSVBaseModel
{
    public int DatabaseID { get; set; }
    public string EntityType { get; set; } //make object
    public string Name { get; set; }
    public int StepNumber { get; set; }
    public virtual Job JobModel { get; set; }
    public TestNode(int databaseID, string entityType, string name, int stepNumber)
    {
        DatabaseID = databaseID;
        EntityType = entityType;
        Name = name;
        StepNumber = stepNumber;
    }
}

还有我的清单:

List<TestNode> testNodes = new List<TestNode>();

这是错误发生的地方(在冒号之后,在语句中):

job.TestNodes = string.IsNullOrEmpty(columns[2]) ? job.TestNodes : testNodes.Add(new TestNode(nodeCounter += 1, "JobExecutor", columns[2], 0));

谁能告诉我为什么它不会转换?任何帮助,将不胜感激。

编辑 :

TestNodes 是另一个对象的通用列表属性。testNodes 是一个特定于正在编译的 byteArray 的列表。我希望这是有道理的。也许这提供了一个更好的背景:

private Job ProcessFile2(byte[] filestream)
{
    List<TestNode> testNodes = new List<TestNode>();
    Job job = new Job();
    Guid uniqueRecordId = Guid.NewGuid();
    StreamReader streamReader = new StreamReader(new MemoryStream(filestream), System.Text.Encoding.UTF8, true);
    DateTime creationDate = DateTime.Now;
    int nodeCounter = 0;

    string line;
    int linecounter = 0;
    while ((line = streamReader.ReadLine()) != null)
    {
        if (linecounter > 1)
        {
            var columns = line.Split(",");
            job.JobName = string.IsNullOrEmpty(columns[1]) ? job.JobName : columns[1];
            job.TestNodes = string.IsNullOrEmpty(columns[2]) ? job.TestNodes : new List<TestNode> { new TestNode(nodeCounter += 1, "JobExecutor", columns[2], 0) };
            job.TestNodes= string.IsNullOrEmpty(columns[3]) ? job.TestNodes : testNodes.Add(new TestNode(nodeCounter += 1, "OrganisationType", job.OrganisationType, 0));
            job.ContractingOrganisationType = string.IsNullOrEmpty(columns[4]) ? job.ContractingOrganisationType : columns[4];
            job.TestNodes = string.Equals(columns[0], "Job Step") ? testNodes.Add(new TestNode(nodeCounter += 1, "StepName", columns[6], Convert.ToInt32(columns[5]))) : job.TestNodes;
            job.TestNodes = string.Equals(columns[0], "Custom Input") ? testNodes.Add(new TestNode(nodeCounter += 1, "InputName", columns[6], Convert.ToInt32(columns[5]))) : job.TestNodes;
            job.TestNodes = string.Equals(columns[0], "Custom Output") ? testNodes.Add(new TestNode(nodeCounter += 1, "OutputName", columns[6], Convert.ToInt32(columns[5]))) : job.TestNodes;
            job.TestNodes = string.Equals(columns[0], "Generic Input") ? testNodes.Add(new TestNode(nodeCounter += 1, "GenericInputName", columns[6], Convert.ToInt32(columns[5]))) : job.TestNodes;
            job.Record = uniqueRecordId;
            job.CreationDate = creationDate;
            job.ModificationDate = creationDate;
            job.CreateBy = "System";
            job.ModifyBy = "System";
        }
        linecounter++;
    }
    return job;
}

标签: c#implicit-conversion

解决方案


您对三元运算符的使用...

job.TestNodes = string.IsNullOrEmpty(columns[2]) ? job.TestNodes : testNodes.Add(new TestNode(nodeCounter += 1, "JobExecutor", columns[2], 0));

...有效地像这样工作...

if (string.IsNullOrEmpty(columns[2]))
{
    job.TestNodes = job.TestNodes;
}
else
{
    job.TestNodes = testNodes.Add(new TestNode(nodeCounter += 1, "JobExecutor", columns[2], 0));
}

List<>.Add()方法具有此签名...

public void Add (T item);

void意味着它不返回任何东西。您不能将void方法的结果分配给其他存储,因为没有要分配的结果。(请注意,这与碰巧返回的方法不同null。)

要解决此问题,请分别执行您的调用Add()和后续List<>分配...

if (string.IsNullOrEmpty(columns[2]))
{
    job.TestNodes = job.TestNodes;
}
else
{
    testNodes.Add(new TestNode(nodeCounter += 1, "JobExecutor", columns[2], 0));
    job.TestNodes = testNodes;
}

由于块的true分支if实际上是一个空操作,我们可以简单地重写它......

if (!string.IsNullOrEmpty(columns[2]))
{
    testNodes.Add(new TestNode(nodeCounter += 1, "JobExecutor", columns[2], 0));
    job.TestNodes = testNodes;
}

根据job.TestNodes分配方式,可能需要改为...

job.TestNodes = testNodes;
if (!string.IsNullOrEmpty(columns[2]))
{
    testNodes.Add(new TestNode(nodeCounter += 1, "JobExecutor", columns[2], 0));
}

推荐阅读