2015-10-12 1 views
1

Я кипеть его вниз к простому примеру:C# Почему нет неявного приведения из SqlDbType в DbType?

using System; 
using System.Data; 


class MyProgram 
{ 
    void DoStuff(DbType t) 
    { 

    } 

    public MyProgram() 
    { 
     DoStuff(SqlDbType.Int); 
    } 
} 

class Program 
{ 
    public static void Main(string[] args) 
    { 
     MyProgram p = new MyProgram(); 
    } 
} 

Почему я должен назвать это таким образом?

DoStuff((DbType)SqlDbType.Int); 

Является ли это просто потому, что они являются всего лишь два счетчиками и есть что-то за кулисами, связывающих их друг с другом?

веселит, Alex

+0

Как следует вести себя программа, когда вы делаете 'DoStuff (SqlDbType.Image)' или 'DoStuff (SqlDbType.Structured)'? –

ответ

2

SqlDbType и DbType два совершенно отдельных перечислений. Они так же совместимы, как и enum Colors, и enum DayOfTheWeek были бы, насколько компилятор может сказать.

Вам нужно выполнить бросок, чтобы сообщить компилятору «Я знаю, что это разные типы, но я хочу, чтобы вы так же относились к другому».

Перечисление используется ключевое слово, чтобы объявить перечисление, а особый тип, который состоит из набора именованных констант, называемых список переписчик.

Источник: MSDN (курсив мой)

Обратите внимание, что MSDN не описывает каких-либо конкретных базовые значения для SqlDbType или DbType, так что даже если SqlDbType.BigInt и DbType.BigInt имеют те же основные ценности сегодня, не является документально подтвержденной гарантией того, что он будет оставаться таким, или что это так на каждой реализации .NET.

Однако MSDN делает следующие гарантии

При настройке параметров команды, то SqlDbType и DbType связаны между собой. Поэтому установка DbType изменяет SqlDbType на поддерживающий SqlDbType.

Лучший способ приблизиться ваш код будет

DoStuff(DbType.Int); 
+0

отметили как ответ, спасибо, еще один вопрос: что, если я просто использую DBType как переходный, а источником является (DbType) SqlDbType.Int, а получатель получает DbType, а затем возвращается к SqlDbType? Гарантировано ли всегда, что они имеют одинаковые значения? – Alex

+0

Если вы применяете (SqlDbType) (DbType) SqlDbType.Int, нет явной гарантии, что вы получите тот же SqlDbType, с которого вы начали. В действительности вы, вероятно, будете, по крайней мере, для значений, которые являются общими для SqlDbType и DbType, но структура не гарантирует эту гарантию. –

Смежные вопросы