C# явная строка броска к перечислению

После дальнейших раскопок я пришел к следующему результату: вам просто нужно красиво поговорить с ROW ().

Это будет работать:

INSERT INTO outputTable
SELECT ROW(col1, col2) 
FROM (
  SELECT 
    col1, 
    ROW(col1, col1) as col2 
  FROM inputTable
) tbl2

Примечание:

  • Вложение: Возможно, SQL допускает только один уровень вложения. Но вам разрешено несколько табличных выражений. Я полагаю, что в данный момент Flink мало что делает для преобразования семантики SQL, прежде чем передать ее в механизм исполнения. План выполнения создаст объединенную строку (col1, ROW (col1, col1)) в одном блоке, так что это не так эффективно.
  • ROW (col1, col1): ROW (col1) во вторичной таблице не будет работать. (это будет работать автономно в первой таблице). Не знаю почему. Но эй, мне действительно нужно это, когда у меня есть только одно значение? Я могу свернуть это одно значение. Если у вас есть некоторая свобода действий в выходной схеме, это не будет проблемой.

Я представил вопрос JIRA здесь:

https://issues.apache.org/jira/projects/FLINK/issues/FLINK-11399

Будет обновлять этот пост соответственно

23
задан p.campbell 7 February 2013 в 23:07
поделиться

3 ответа

Атака невозможна. Проблема заключается в том, что определяемое пользователем преобразование должно быть включено в объявление структуры или класса, а преобразование должно быть в / из включающего типа. Таким образом,

public static explicit operator MyEnum(string value)

невозможно, потому что ни MyEnum, ни string никогда не могут быть включающим типом.

Соответствующим разделом спецификации ECMA334 C # является 17.9.4:

Оператор преобразования преобразует из типа источника, указанного в типе параметра оператора преобразования, в целевой тип, указанный в возврате тип оператора преобразования. Классу или структуре разрешается объявлять преобразование из исходного типа S в целевой тип T только в том случае, если все из перечисленных ниже истинно, где S0 и T0 - это типы, которые возникают в результате удаления конечного символа? модификаторы, если таковые имеются, из S и T:

S0 и T0 - это разные типы.

Либо S0, либо T0 - это класс или тип структуры, в которых происходит объявление оператора .

Ни S0, ни T0 не являются интерфейсом.

За исключением пользовательских преобразований, преобразования не существует из S в T или из T в S.

Тем не менее, вы можете сделать метод расширения для строкового класса.

public static class StringExtensions {
    public static T ConvertToEnum<T>(this string value)  {
        Contract.Requires(typeof(T).IsEnum);
        Contract.Requires(value != null);
        Contract.Requires(Enum.IsDefined(typeof(T), value));
        return (T)Enum.Parse(typeof(T), value);
    }
}
29
ответ дан 29 November 2019 в 02:12
поделиться

Вы также можете использовать атрибуты «StringValue», чтобы получить то, что вы хотите.

Проверьте этот вопрос: stackoverflow.com/questions/424366/c-string-enums , там есть много информации, которая может помочь.

веселит

0
ответ дан 29 November 2019 в 02:12
поделиться

Нужно ли использовать оператор приведения? Другой вариант - добавить метод расширения вне строки:

public static class StringEnumConversion
{
    public static T Convert<T>(this string str)
    {
        return (T)Enum.Parse(typeof(T), str);
    }
}
9
ответ дан 29 November 2019 в 02:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: