我注意到隐式运算符需要被称为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这个词,我只是在它如何使用方法和类方面使用它。
答案 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)
这是我的第二个答案,试图猜测你的根本问题(而不是回答标题中的问题,就像我在第一个答案中所做的那样):
从编辑的问题和评论中,看起来你正试图:
InputBox
类的单个实例。string
。我确保你真的需要强制只有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();
但任何阅读你代码的人都会哭;)