无法通过这个'作为ref或out参数,因为它是只读的

时间:2016-09-08 21:53:22

标签: c#

我的类将自己传递给另一个类中的方法。这个外部方法(下面代码中的最后一行)改变了我相应传递的对象,返回控制,并以其快乐的方式继续。但最后一行declare @ProdChange table(ProductID int, FK_ProductID INT, FK_FinalProductID INT, ChangedBy Varchar(100)) declare @Prod table(ProductID int, ProductName Varchar(100)) insert into @Prod Values(1,'Red Bike') insert into @Prod Values(3,'Green Bike') insert into @ProdChange Values(1,1,3,'John') select * from @Prod select * from @ProdChange SELECT old.ProductName, new.ProductName as FinalProductName FROM @Prod as old INNER JOIN @ProdChange as link ON old.ProductID = link.FK_ProductID INNER JOIN @Prod as new ON new.ProductID = link.FK_FinalProductID 在设计时说明了这一点:

  

无法通过'这个'作为ref或out参数,因为它是只读的***

那里没有只读属性。我该如何解决这个问题?

ThisPaymentGateway.Process(ref this);

2 个答案:

答案 0 :(得分:3)

删除"参考"来自调用和流程方法签名

如果你只想改变对象"然后返回,无论如何你都不需要通过ref传递它。类已经是引用类型,因此如果在Process中更改对象属性,它将在源对象中更改它们。

答案 1 :(得分:1)

首先不要使用字符串而不是enum可能不明显,但您正在进行文化感知比较并且您正在转换{{1使用当前文化规则使用大写字母。这是什么意思?教科书示例是土耳其语语言环境:PaymentMethod。如果您需要比较两个字符串,无论使用"ind".ToUpper() != "IND"(这里我假设,因为一个字符串是硬编码的,您希望使用不变的文化规则进行比较,但也可能是顺序比较)。

在C#中,您不需要以这种方式声明命名空间,此语法有效:

String.Equals(PaymentMethod, "IND", StringComparer.InvariantCultureIgnoreCase)

关于您的问题:使用namespace Something.Finance.Donations { } 传递的变量可能已更改。这个(让我们想象它是一个变量,想象一下......)显然无法改变,那么你就有了编译错误。

阅读本文:

ref

将它们视为指向变量的指针,而不是该变量的值(在C#参数中按值传递,您需要static void ChangeAnimalWithRef(ref Animal animal) { animal = new Cat(); Debug.Assert(animal.GetType() == typeof(Cat)); } static void ChangeAnimalWithoutRef(Animal animal) { animal = new Cat(); Debug.Assert(animal.GetType() == typeof(Cat)); } void Test1() { Animal animal = new Dog(); Debug.Assert(animal.GetType() == typeof(Dog)); ChangeAnimalWith(ref animal); Debug.Assert(animal.GetType() == typeof(Cat)); } void Test2() { Animal animal = new Dog(); Debug.Assert(animal.GetType() == typeof(Dog)); ChangeAnimalWithoutRef(animal); Debug.Assert(animal.GetType() == typeof(Dog)); } ref通过引用传递它们。)

如果你拥有out方法,我敢打赌你不需要ThisPaymentGateway.Process()修饰符而你只需使用来使用{{{c>引用ref 1}}。在C#中,事情是不同的。

如果由于任何不明原因,您不拥有该方法且其签名无法更改,那么您有两种选择:

1)创建一个虚拟变量:

&

2)从课外调用该函数(并稍微改变你的逻辑):

Electronic1 dummy = this;
ThisPaymentGateway.Process(ref dummy);
Debug.Assert(Object.ReferenceEquals(dummy, this), "Ooops, what are we supposed to do?");

我强烈怀疑你需要其中任何一个,这只是为了完整。