为什么隐式运算符是静态的?

时间:2013-06-13 06:02:12

标签: c#

我注意到隐式运算符需要被称为static,但实际上它根本不是静态的...为什么隐式运算符不能静态访问,但可以通过实例访问它。这与静态完全相反。假设我想要一个静态静态隐式运算符,以便我可以隐式转换类的静态状态。

例如

a = new b(); // implicitly converts b to a.
a = b(); // implicitly convert the static states of b to a.

因此,例如b是一个非静态类,因为它有一个表单,但是对于所有意图和目的,它是静态的,并且所有实例都共享相同的信息,所以我想隐式转换类的静态内部。

我会尝试详细介绍我的例子,因为Jeff认为这没有任何意义。

class b显示一个对话框表单,但它会将输入的所有信息保存到静态变量中。这是因为b的实例仅显示对话框表格,输入的数据是一个逻辑数据块(输入的数据只有一个逻辑实例)。所有静态变量都直接适合class a,因此我可以将b中的静态变量无缝转换为a class的实例,但是我想使用隐式运算符来代替有一个单独的方法。但它让我感到遗憾的是,我无法拥有实际 静态隐式运算符。也许我误解了static这个词,我只是在它如何使用方法和类方面使用它。

4 个答案:

答案 0 :(得分:4)

如果operator不是static,则无法处理null个操作数。

这同样适用于隐式转换运算符的情况:

public class MyClass
{
    public MyClass(int x)
    {
        this.X = x;
    }

    public int X { get; private set; }

    public static implicit operator int(MyClass operand)
    {
        if (operand == null)
        {
            return 0;
        }    
        return operand.X;
    }
}

internal class Program
{
    internal static void Main(string[] args)
    {
        MyClass x = null;
        int y = x; // What instance would a non-static operator use here?
    }
}

答案 1 :(得分:1)

没有运算符处理类的“静态”(可能typeof除外)。换句话说,不可能做这样的事情:

var result = System.Int32 + System.Int32;

操作符仅适用于类的实例

int a = ..., b = ...;
var result = a + b;

所有运算符都必须是静态的,因此不需要在“常规静态”运算符和“静态静态”运算符之间消除歧义。

您可以考虑使用singleton pattern。像这样:

public class Foo
{
    public int Member { get; set; }

    private static Foo instance = new Foo();
    public static Foo Instance { get { return instance; } }

    private Foo()
    {
    }

    public static implicit operator int(Foo foo)
    {
        return foo.Member;
    }
}

然后您可以将其用作:

int a = Foo.Instance;

答案 2 :(得分:1)

在C#中,所有运算符定义都是静态的,例如参见http://msdn.microsoft.com/en-us/library/aa288467(v=vs.71).aspx

- 二元运算符定义,当然,因为将一个或另一个声明为this是任意的。

- 一元运算符定义,以匹配二进制运算符定义为静态的主题。

通过这种方式完成惯例。

答案 3 :(得分:1)

这是我的第二个答案,试图猜测你的根本问题(而不是回答标题中的问题,就像我在第一个答案中所做的那样):

从编辑的问题和评论中,看起来你正试图:

  1. 确保只有InputBox类的单个实例。
  2. 将输入框类中的数据转换为string
  3. 我确保你真的需要强制只有InputBox类的一个实例,但是如果这个要求是有根据的那么你可以做这样的事情,使用单例模式,并覆盖ToString实例方法。:

    class InputBox
    {
       static InputBox Instance = new InputBox();
    
       int someNumber;
    
       string someText;
    
       private InputBox()
       {
       }
    
       // ...    
    
       public override string ToString()
       {
           return someNumber.ToString() + " " + someText;
       }
    }
    

    用法:

    string result = InputBox.Instance.ToString();
    

    附录:

    如果它真的所有关于你想要使用的语法,你可以添加这样的委托:

            // Please don't really do this ;)
            Func<string> InputBox = () => MyNamespace.InputBox.Instance.ToString();
    

    然后像这样使用它:

            string result = InputBox();
    

    但任何阅读你代码的人都会哭;)