C# 自定义C编译器警告

C# 自定义C编译器警告,c#,C#,如果我尝试执行从double到int的隐式转换,我会得到 *编辑中的警告 *编译错误 如何为自定义类型的运算符实现此行为 public struct A { private readonly double value; public A(double value) { this.value = value; } // NOTE I want this operation to be prohibited public stati

如果我尝试执行从double到int的隐式转换,我会得到 *编辑中的警告 *编译错误

如何为自定义类型的运算符实现此行为

public struct A
{
    private readonly double value;

    public A(double value)
    {
        this.value = value;
    }

    // NOTE I want this operation to be prohibited
    public static A operator +(A a, B b)
    {
        throw new InvalidOperationException();
    }

    public static implicit operator double(A a)
    {
        return a.value;
    }

    public static implicit operator A(double value)
    {
        return new A(value);
    }
}

public struct B
{
    private readonly double value;

    public B(double value)
    {
        this.value = value;
    }

    public static implicit operator double(B b)
    {
        return b.value;
    }

    public static implicit operator B(double value)
    {
        return new B(value);
    }
}

public class Example
{
    public void Method()
    {
        A a = 0.0d;
        B b = 0.0d;

        // QUESTION is there any way to show custom editor errors and/or make compilation fail?
        A result = a + b;
    }
}
正如您在示例中所看到的,如果值类型A和B是加法的操作数,我将抛出一个异常


我想显示编辑器警告和/或使编译失败。有什么方法可以实现这个行为吗?

如果没有转换,并且您不需要做任何事情,那么这就是编译器的默认行为

但要进行转换,需要重载示例中的运算符

还有其他运算符,您可以从中重载样本:

有没有办法显示自定义编辑器错误和/或使编译失败

如果你想这样做,你所要做的就是不要定义你在下面的代码中添加的+操作符,我希望这个操作被禁止


另请参见。

它非常简单。不能将类型double隐式转换为int类型。需要使用int y=Convert.ToInt32x。请下次尝试传递实际代码,而不是图像…默认行为。如果您没有为自定义类显式定义强制转换,那么除了Course的多态性之外,您无法将其强制转换到任何其他类。我对这个问题感到困惑。如果您在任何两种类型(包括您编写的类型)之间执行不允许的隐式转换,编译器已经向您发出警告或错误。你到底在问什么?问题是如何制作Roslyn分析仪?有关一些有用的链接,请参阅。//问题:有没有办法显示自定义编辑器错误和/或使编译失败?OP问题的明确双关语回答是,要获得所需的行为,必须使用显式运算符关键字定义转换运算符方法。注意,如果转换中数据丢失,则应考虑抛出或允许异常。另一个例子请参见此链接:我将隐式运算符从struct添加到了自定义类型,警告消失了。我编辑了问题和小提琴。
public static explicit operator Celsius(Fahrenheit fahr)
{
    return new Celsius((5.0f / 9.0f) * (fahr.Degrees - 32));
}
public static Fraction operator +(Fraction a, Fraction b)
{
    return new Fraction(a.num * b.den + b.num * a.den,
       a.den * b.den);
}