我不明白这是如何编译的。
我有一个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));
我理解错误。您无法通过引用传递枚举,因为枚举是常量而无法分配。所以我有两个问题:
提前致谢,
蒂姆答案 0 :(得分: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
;那些东西可以 输入为枚举。
答案 1 :(得分:0)
像这样写你的存根:
Line.EligibleType et = Line.EligibleType.SkipNone;
line.Stub(s => s.Eligible(ref et))
.OutRef(Line.EligibleType.skipNone).Return(true);
参考必须是可分配的。你不能传递常数。