C# 无法将带[]的索引应用于类型为';Castle.proxy.RangeProxy';
是什么导致此异常?我试图使用C# 无法将带[]的索引应用于类型为';Castle.proxy.RangeProxy';,c#,excel,unit-testing,mocking,moq,C#,Excel,Unit Testing,Mocking,Moq,是什么导致此异常?我试图使用Moq模拟Microsoft.Office.Interop.Excel.Range。我想在其中嵌套另一个模拟的范围。但是当我尝试访问嵌套异常时,会抛出一个异常 例外情况 无法将带[]的索引应用于类型为的表达式 “城堡,代理,代理” 代码 [TestMethod] public void RangeProxyIndexTest() { // creating first range var cell1 = new Moq.Mock<Range>
Moq
模拟Microsoft.Office.Interop.Excel.Range
。我想在其中嵌套另一个模拟的范围
。但是当我尝试访问嵌套异常时,会抛出一个异常
例外情况
无法将带[]的索引应用于类型为的表达式
“城堡,代理,代理”
代码
[TestMethod]
public void RangeProxyIndexTest()
{
// creating first range
var cell1 = new Moq.Mock<Range>();
cell1.Setup(c => c.Value2).Returns("1");
var range1Mock = new Moq.Mock<Range>();
range1Mock.SetupGet(r => r[1, Moq.It.IsAny<Object>()]).Returns(cell1.Object);
var range1 = range1Mock.Object;
// creating second range
var cell2 = new Moq.Mock<Range>();
cell2.Setup(c => c.Value2).Returns("2");
var range2Mock = new Moq.Mock<Range>();
range2Mock.SetupGet(r => r[1, Moq.It.IsAny<Object>()]).Returns(cell2.Object);
var range2 = range2Mock.Object;
// merging both ranges into 1
var range3Mock = new Moq.Mock<Range>();
range3Mock.SetupGet(r => r[1, Moq.It.IsAny<Object>()]).Returns(range1);
range3Mock.SetupGet(r => r[2, Moq.It.IsAny<Object>()]).Returns(range2);
var range3 = range3Mock.Object;
// testing succeeds
Assert.AreEqual("1", range1[1].Value2);
Assert.AreSame(range1, range3[1]);
Assert.AreEqual("2", range2[1].Value2);
Assert.AreSame(range2, range3[2]);
// exceptions are thrown here
Assert.AreEqual("1", range3[1][1].Value2);
Assert.AreEqual("2", range3[2][1].Value2);
}
[TestMethod]
public void RangeProxyIndexTest()
{
//创建第一个范围
var cell1=新的最小起订量Mock();
单元格1.设置(c=>c.Value2).返回(“1”);
var range1Mock=new Moq.Mock();
range1Mock.SetupGet(r=>r[1,Moq.It.IsAny()).Returns(cell1.Object);
var range1=range1Mock.Object;
//创建第二个范围
var cell2=新的最小起订量Mock();
cell2.Setup(c=>c.Value2)。返回(“2”);
var range2Mock=new Moq.Mock();
range2Mock.SetupGet(r=>r[1,Moq.It.IsAny()).Returns(cell2.Object);
var range2=range2Mock.Object;
//将两个范围合并为1
var range3Mock=new Moq.Mock();
range3Mock.SetupGet(r=>r[1,Moq.It.IsAny()).Returns(range1);
range3Mock.SetupGet(r=>r[2,Moq.It.IsAny()).Returns(range2);
var range3=range3Mock.Object;
//测试成功
Assert.AreEqual(“1”,范围1[1].Value2);
Assert.AreName(范围1,范围3[1]);
Assert.AreEqual(“2”,范围2[1].Value2);
Assert.AreName(范围2,范围3[2]);
//这里抛出异常
Assert.AreEqual(“1”,范围3[1][1].Value2);
Assert.AreEqual(“2”,范围3[2][1].Value2);
}
尽管情况不同,但此异常的原因与
将验证部分更改为:
Assert.AreEqual("1", (range3[1] as Range)[1].Value2);
Assert.AreEqual("2", (range3[2] as Range)[1].Value2);
有关更多信息,请阅读尽管情况不同,但此异常的原因与 将验证部分更改为:
Assert.AreEqual("1", (range3[1] as Range)[1].Value2);
Assert.AreEqual("2", (range3[2] as Range)[1].Value2);
有关更多信息,请阅读,可能是因为
range3
不是二维数组?@Rafalon[]]
不是c
中二维数组的语法(在java
[]
中是二维数组)在c
中是聚合索引器调用,这是OP问题的根源。。。第一个索引器返回动态类型,然后运行时绑定器无法计算第二个索引器。可能是因为range3
不是二维数组?@Rafalon[]
不是c#
中二维数组的语法(在java
[]
中是二维数组)在c#
中,它是一个聚合索引器调用,这是OP问题的根源。。。第一个索引器返回动态类型,然后运行时绑定器无法计算第二个索引器。