我在一些网站上查了一下,似乎我找不到答案 让我们说iv得到了这个结构" MyStruct"
public struct MyStruct
{
private int value;
private MyStruct(int i)
{
value = i;
}
public static implicit operator MyStruct(int I)
{
return new MyStruct(I);
}
public static implicit operator int (MyStruct MS)
{
return MS.value;
}
public static explicit operator uint (MyStruct I)
{
return Convert.ToUInt32(I);
}
}
我想在显式运算符
上做if (I< 40) Then it will throw a compiler warning
else if (I > 50) Then it will throw a compiler error
else -> it will return a value
我知道我可以使用throw异常,但我只想要警告/错误部分 所以它会是这样的:
public class Program
{
static void Main()
{
MyStruct MS1 = 30;
MyStruct MS2 = 60;
Console.WriteLine((uint)MS1);//So it will throw a warning
Console.WriteLine((uint)MS2);//So it will throw an error
Console.ReadKey();
}
}
如果我想尝试做类似的事情:
public static explicit operator uint (MyStruct I)
{
if (I < 40)
{
#warning Number must be less than 50 and bigger than 40
}
else if (I > 50)
{
#error Number must be less than 50 and bigger than 40
}
return Convert.ToUInt32(I);
}
它只是抛出警告和错误,甚至没有调用操作符 我不能在变量上使用#If /#Else
如果我将使用Obsolete属性,它将执行相同的
任何帮助都会非常适合! :)
答案 0 :(得分:0)
即使使用Roslyn扩展程序,您也不会通常能够实现此目的。
在您展示的示例中,理论上可以这样做(在Roslyn中,它为您提供编译时挂钩),但即使需要对代码进行一些非平凡的分析来识别{{的值1}}变量,因为它们将在运行时调用MyStruct
运算符。
但是任何其他例子都无法实现这一目标。 explicit uint
值可以来自任何地方,使用任何值初始化。没有理由从正在分析的同一方法中的MyStruct
文字进行初始化,因此初始化将对任何分析器隐藏(好吧,任何当前C#支持的任何分析器)编译器)。
确实,使变量如此强大的一个原因是它们可以包含任意值,在代码中传递,操纵等等。正是这种相同的功能使得在编译时尝试检测到什么是不切实际的变量的值将在运行时。
从您的问题中不清楚您尝试解决的更广泛的问题。但无论如何,你都会以错误的方式解决问题。我建议您发布一个新问题,清楚准确地解释更广泛的问题,以便您可以获得一些特定的帮助。