【问题标题】:Extension Methods not working properly C#扩展方法无法正常工作 C#
【发布时间】:2012-07-05 10:24:23
【问题描述】:

所以我有一个简单的方法叫做Invert

public static void Invert(this bool value)
{
    value = !value;
}

它位于.dll 文件中的静态类中。现在,当我进入一个新的 Winforms 项目时,我添加了 .dll 作为参考,到目前为止一切都很好。现在当我这样做时:

bool test = true;
test.Invert();

我没有收到错误,但是当我这样做时:

MessageBox.Show(test.ToString());

它输出true,好像什么都没有改变。我不确定是因为我在方法中所做的事情还是其他原因。但如果我去:

MessageBox.Show((!test).ToString());

它输出false

谢谢。

【问题讨论】:

    标签: c# extension-methods pass-by-value


    【解决方案1】:

    这工作正常。因为bool 是一个值类型,所以它作为一个值传递并且原始变量(test)永远不会被更改。

    相反,您应该执行以下操作:

    public static bool Invert(this bool value) 
    { 
        return !value; 
    } 
    

    但是,创建一个方法来完成语言本身的工作有点浪费时间。

    我认为扩展方法不会让您通过引用获取 this 参数,因此您必须使用常规静态方法,并长期调用它:

    public static bool Invert(ref bool value) { value = !value; }
    
    BooleanHelpers.Invert(ref test);
    

    最后,这样做会更干净、更容易(更不用说对其他开发人员来说更明显了):

    test = !test;
    

    【讨论】:

    • 我知道这是浪费时间,但我只是在学习扩展方法并决定尝试一个简单的方法。
    【解决方案2】:

    bool 是一种值类型,您没有通过引用传递它。您需要将Invert 的结果分配给另一个或相同的变量才能使其持久化。

    【讨论】:

      【解决方案3】:

      您的扩展方法通过值而不是通过引用接收bool。该方法的主体正在更改 bool 的本地副本,而不是调用者拥有的原始值。

      【讨论】:

      • 那我怎样才能让方法引用它呢?
      • @MatthewRz 例如,您可以使用ref 注释参数。
      猜你喜欢
      • 1970-01-01
      • 2017-05-03
      • 1970-01-01
      • 2018-07-30
      • 1970-01-01
      • 1970-01-01
      • 2018-01-17
      • 2020-10-09
      • 1970-01-01
      相关资源
      最近更新 更多