运行带有错误的C#protobuf示例

时间:2018-11-08 04:18:44

标签: c# protocol-buffers rider google-protocol-buffer

使用C#的新手,我在MacOS上安装了Rider,并在解决方案中安装了Google.Protobuf和protobuf-net。我在link上找到了C#protobuf的示例,并将文件添加到解决方案中。但是,当我编译.cs文件时,出现了这些错误。

  

Addressbook.cs(263,57):[CS1615]参数1可能无法与'ref'关键字一起传递
  Addressbook.cs(445,61):[CS1615]参数1可能无法与'ref'关键字一起传递
  Addressbook.cs(580,57):[CS1615]参数1可能无法与'ref'关键字一起传递

那么如何解决这些问题?

2 个答案:

答案 0 :(得分:0)

方法参数似乎不接受引用:ref argument;

要解决此问题,请确保删除行中参数前的ref Addressbook.cs文件的263、445、580。

示例:

if (!pb::UnknownFieldSet.MergeFieldFrom(ref _unknownFields, input)) {
          return;
}

应为:

if (!pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input)) {
          return;
}

答案 1 :(得分:0)

通过比较官方示例和protoc --csharp_out文件,我发现差异出现在@nnty提到的子句中。在官方示例中,该子句替换为

DECLARE 
    @t1 TABLE ( ProductID VARCHAR(50), ICommitted INT)

INSERT INTO @t1 VALUES ('Some product', 7)

DECLARE 
    @t2 TABLE (RowID INT, DueDate DATE, IncommingQuantity INT)

INSERT INTO @t2 VALUES 
(1,'2018-11-19', 5),
(2,'2018-11-20', 4),
(3,'2018-11-20', 4),
(4,'2018-11-20', 3),
(5,'2018-11-22', 12)

SELECT  
    RowID 
,   DueDate
,   CASE 
        WHEN RowID = 1 
        THEN 0 
        WHEN RowID = LAST_VALUE(RowID) OVER(ORDER BY (SELECT NULL) )    
        THEN IncommingQuantity
        WHEN ROW_NUMBER() OVER(PARTITION BY DueDate ORDER BY RowID) > 1 
        THEN IncommingQuantity
        ELSE ICommitted - LAG(IncommingQuantity) OVER (ORDER BY RowID)
    END  IncommingQuantity
FROM @t2 t2
CROSS APPLY (SELECT t1.ICommitted FROM @t1 t1) e

因此,用上面的句子更改所有错误的位置可能有助于解决问题。