Почему Option Strict не ругается на разные Enum

Alexander_fx
Дата: 16.06.2014 17:32:40
Привет
Как заставить компилятор выдавать ошибку в том случае если используется тип описанный одним enum а сравнивается другой
Что то типа

enum one
a=0
b=1
c=2
end enum

enum two
d=0
e=1
f=2
end enum

dim test as one
if one=two.d Вот тут хочу чтобы компилятор ругался
bazile
Дата: 17.06.2014 03:04:36
Alexander_fx, крайне странное поведение. Спецификация утверждает, что при Option Strict On разрешены только неявные widening преобразования типов, а преобразование из одного enum в другой является narrowing преобразованием:
The set of implicit conversions depends on the compilation environment and the Option Strict statement. If strict semantics are being used, only widening conversions may occur implicitly. If permissive semantics are being used, all widening and narrowing conversions (in other words, all conversions) may occur implicitly.

Narrowing Conversions
....
From a numeric type to an enumerated type.
From an enumerated type to a numeric type its underlying numeric type has a narrowing conversion to.
From an enumerated type to another enumerated type.

Лично мне тоже интересно понять почему компилятор себя так ведет. Кстати dotPeek показал просто сравнение переменных. Надо еще на уровне IL кода посмотреть.
D129
Дата: 17.06.2014 12:36:58
bazile
Лично мне тоже интересно понять почему компилятор себя так ведет. Кстати dotPeek показал просто сравнение переменных. Надо еще на уровне IL кода посмотреть.

В бейсике же есть автоматическое приведение типов. Может это оно срабатывает?
D129
Дата: 17.06.2014 12:44:09
Alexander_fx
dim test as one
if one=two.d      


А почему у вас "test" - нигде не используется? В примере?
D129
Дата: 17.06.2014 12:47:45
Alexander_fx,

До меня дошло.
в проверке условия (оно, кстати, никогда не будет истинным) вы проверяете, равен ли тип One типу Integer.

:-)

В шарпе очень даже ругается компилятор.
Alexander_fx
Дата: 17.06.2014 13:08:51
D129,
вот код
сообщение выскакивает и компилятор не ругается
Option Strict On
Option Explicit On
Module Module1
    Public Enum one
        a = 0
        b = 1
        c = 2
    End Enum
    Public Enum two
        aa = 0
        bb = 1
        cc = 2
    End Enum
    Sub Main()
        Dim test As one
        If test = two.aa Then
            MsgBox("test=two.aa")
        End If
    End Sub
End Module
D129
Дата: 17.06.2014 13:52:45
Alexander_fx,

One test;

			test = One.b;
			if(test == Two.e)
			{ 
			
			
			}


А в шарпе - ругается.
Пишите на том, что вам в данный момент нужно.
:-)

Бейсик очень вольно обращается с типами. Взял и преобразовал - и не сказал.
Попробуйте перевернуть условие - ради эксперимента....
D129
Дата: 17.06.2014 13:57:00
Alexander_fx,

Вообще-то, сторого говоря, сравнивать значения разных перечислений - это только шутки ради можно...
D129
Дата: 17.06.2014 14:00:03
enum Material
		{
			soft, middle, hard
		}

		enum Color
		{
			red, blue, green, gray
		}

		void Joke()
		{
			if(Material.soft == Color.green)
			{ 
			
			//:-)
			}
		
		}
Alexander_fx
Дата: 17.06.2014 14:16:27
D129
enum Material
		{
			soft, middle, hard
		}

		enum Color
		{
			red, blue, green, gray
		}

		void Joke()
		{
			if(Material.soft == Color.green)
			{ 
			
			//:-)
			}
		
		}


так я понимаю в шарпе тут ругается
вот я и думаю какая настройка среды отвечает за это