0

我不明白这是如何编译的。

我有一个带有以下内容的 VB.net 类:

Public Class Line
    Public Enum EligibleType
        skipNone = 0
        skipAllow = 1
        skipPay = 2
        skipDeleted = 4
        skipMod = 8
        skipOverride = 16
    End Enum

    Public Function Eligible(Optional ByRef enmEligibleFlag As Line.EligibleType = Line.EligibleType.brSkipNone) As Boolean
End Class

这在应用程序中被调用了超过 9,000 次。我尝试在 C# 中为另一个函数编写测试方法,并使用 Rhino Mocks 创建类的存根。然后我将函数存根以始终返回 true。它不会编译。

[TestClass]
public class breMATest
{
    /// <summary>
    /// Tests the 102.
    /// </summary>
    [TestMethod]
    public void Test102()
    {
        // Arrange
        br target = new br();
        var line = MockRepository.GenerateStub<Line>();
        line.Stub(s => s.Eligible(ref Arg<Line.EligibleType>.Ref(brBD.Line.EligibleType, Line.EligibleType.skipNone).Dummy).Return(true);

        // Act
        target.Pay102(ref line);

        // Assert
    }
}

这给了我:

    CS1510: A ref or out argument must be an assignable variable
 UnitTestsCS\brTest.cs(35,13,35,71): error CS1502: The best overloaded method match for 'brBD.Line.Eligible(ref brBD.Line.EligibleType)' has some invalid arguments

我也试过这个,结果相同:

line.Stub(s => s.Eligible(brBD.Line.EligibleType.skipNone)).Return(true);

我尝试直接调用它,同样的错误:

line.Eligible(ref brBD.Line.EligibleType.skipNone));

我理解错误。您不能通过引用传递枚举,因为枚举是一个常量并且不能被赋值。所以我有两个问题:

  1. 有没有办法存根这个总是返回真?
  2. 为什么这在 VB.NET 中有效?

提前致谢,

蒂姆

4

2 回答 2

1

你传递的东西ref是:

Arg<Line.EligibleType>
  .Ref(brBD.Line.EligibleType, Line.EligibleType.skipNone).Dummy

现在; 我们看不到Arg<T>.Ref,但我猜它会返回一个.Dummy作为属性的类。在 C# 中,您不能将属性作为ref. 我想VB选择欺骗这一点,基本上相当于:

var tmp = Arg<Line.EligibleType>.Ref(brBD.Line.EligibleType, Line.EligibleType.skipNone).Dummy;
return s.Eligible(ref tmp)

但是,C# 选择以这种方式工作。IIRC、VB 也允许ref隐含,因此围绕应该如何处理有一些非常不同的设计目标ref

但我必须同意 C#——在ref使用中,你并没有真正传递“对属性的引用”,所以至少对我来说,它避免了不正确的使用方式来工作——即使这更明确。

顺便说一句:如果.Dummy是一个字段,那么您可以将其传递为ref; 但是,这不应被解释为“创建.Dummy一个字段”;那不是我说的;p

我理解错误。您不能通过引用传递枚举,因为枚举是一个常量并且不能被赋值。

您可以将对字段引用、对局部变量/参数的引用以及对数组中事物的引用传递ref;这些东西可以作为枚举类型输入。

于 2013-11-07T14:18:26.917 回答
0

像这样写你的存根:

Line.EligibleType et = Line.EligibleType.SkipNone;
line.Stub(s => s.Eligible(ref et))
    .OutRef(Line.EligibleType.skipNone).Return(true);

ref 必须是可分配的。你不能传递一个常数。

于 2013-11-07T14:32:32.113 回答