0

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

例如

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,但是我想对这个任务使用隐式运算符而不是使用单独的方法。但遗憾的是我不能拥有一个实际的 静态隐式运算符。也许我误解了静态这个词,我只是根据它如何与方法和类一起使用它来使用它。

4

4 回答 4

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?
    }
}
于 2013-06-13T06:18:46.510 回答
1

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

- 二元运算符定义,当然,因为将一个或另一个声明为this.

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

这样做只是惯例。

于 2013-06-13T06:06:33.667 回答
1

这是我的第二个答案,试图猜测您的潜在问题(而不是像我在第一个答案中那样回答标题中的问题):

从编辑的问题和评论中,您似乎正在尝试:

  1. 确保只有一个InputBox类的实例。
  2. 将输入框类中的数据转换为string.

我会确保您确实只需要强制执行该类的单个实例InputBox,但是如果该要求有充分根据,那么您可以使用 Singleton 模式并覆盖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();

但是任何阅读您的代码的人都会哭泣;)

于 2013-06-13T07:05:37.160 回答
1

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

var result = System.Int32 + System.Int32;

运算符仅适用于类的实例

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

所有运算符都必须是静态的,因此无需区分“普通静态”运算符和“静态静态”运算符。

您可以考虑使用单例模式。像这样的东西:

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;
于 2013-06-13T06:06:21.200 回答